RSA攻击

参加个CTF比赛,发现自己零代码量,什么东西都没有准备,被吊打当然正常,基本的工具常用的代码可以自己提前写好的呀

常用的代码有:

gcd:求两个数的最大公约数

egcd:求满足ax+by=1,当gcd(a,b)=1时,满足式子的x和y

hextoflag:很多题目都是给的字母的ord值:两位两位表示一个字母,转化成chr字符就是flag的

b64:base64解密

b32:base32解密

qp:quickpow,快速幂运算

modinv:求cd=1(mod m),在已知c,m,且gcd(c,m)=1的时候,求得c的逆元d

get_phi_n:求n的欧拉函数(这个是做RSA题专用的分解n,因为n是两个大素数相乘)

attacksamen:RSA公模攻击

原理:

http://www.math1as.com/index.php/archives/360/?utm_source=tuicool&utm_medium=referral

http://bobao.360.cn/learning/detail/3058.html

modequation:求ax=b(mod c)的x,一次同余方程,有解的条件是,b % gcd(a,c)=0


代码如下:

#!/usr/bin/env python
# coding=utf-8

from pwn import *
from gmpy2 import iroot
import hashlib
import base64  
import sys
from Crypto.Util.number import bytes_to_long, long_to_bytes
import gmpy2
sys.setrecursionlimit(10000000)  

def hextonumber(x):
	#1234567890abcdef
	#1234567890ABCDEF
	if x>='0' and x<='9':
		return int(x)
	elif x>='A' and x<='F':
		return ord(x)-55
	else:
		return ord(x)-87

def hextoflag(s):
	#word='666c61677b7769656e65725f61747461636b5f61747461636b5f796f757d'
	#flag{wiener_attack_attack_you}
	flag = ''
	i = 0
	while (i<len(s)):
		flag += chr(hextonumber(s[i])*16+hextonumber(s[i+1]))
		i += 2
	return flag

def b64(s):
	#word = 'Y3RmezY2NjY2Nn0='
	#ctf{666666}
	return base64.b64decode(s)

def b32(s):
	#word = 'GYYWIY3UMZ5UQML6IIYHSLCXMVWEGMDNMUWVI3ZNJAZVEZL5'
	#61dctf{H1~B0y,WelC0me-To-H3Re}
	return base64.b32decode(s)

def gcd(a, b):
   if a < b:
     a, b = b, a
   while b != 0:
     temp = a % b
     a = b
     b = temp
   return a

def egcd(a,b):
    if b==0:
        return a,1,0
    else:
        g,x,y=egcd(b,a%b)
        return g,y,x-a/b*y

def qp(n,m,p):
    ans=1
    while(m):
        if (m%2==1):
            ans=(ans*n)%p
        n=(n*n)%p
        m=m/2
    return ans

def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = egcd(b % a, a)
        return (g, x - (b // a) * y, y)

def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
        raise Exception('modular inverse does not exist')
    else:
        return (x+m) % m

def get_phi_n(p,q):
    return (p-1)*(q-1)

def attacksamen(n,e1,e2,c1,c2):
	s = egcd(e1 , e2)
	s1 = s[1]
	s2 = s[2]
	if s1 < 0:
		s1 = - s1
		c1 = modinv (c1 , n)
	elif s2 < 0:
		s2 = - s2
		c2 = modinv (c2 , n)
	m = ( qp(c1,s1,n) * qp(c2,s2,n) ) % n
	return hextoflag(str(hex(m))[2:-1])

def modequation(a,b,c):
	#ax==b(mod c)
	#ax+cy==b
	#b%gcd(a,c)==0
	Gcd = gcd(a,c)
	if (b % Gcd != 0):
		return 'No Solution'
	a /= Gcd
	c /= Gcd
	b /= Gcd
	return b*modinv(a,c)%c

if __name__ == "__main__":
	#hextoflag = 
	#b64 = base64.b64decode
	#b32 = base32.b32decode
	#gcd = greatest common divisor
	#egcd =
	#qp = (n^m)%p
	#modinv = (e*d)==1 % n , we have number e and number n to get number d
	#get_phi_n(p,q)
	#attacksamen
	#n = 0x18f60afa6b9938df69338805ae7fbd5652da3ac8fa5b7b65e4755149ba3f80d071fe8845fa20ea3e57e21fb2f630e47e4886de35c51d1487c170a59141f833c3aaea62c539e20664dbfa75f1b2d56ed4dbec991e5bf3306931bfda79b1dd8466f808af159b44be042499d423110ab9cfd595e370029862e2e686ed2a27fb6b459c4fddc0ebd4f112e0f3769524412e7128eb04b02de421df5a0e5b22d2c40acf1727aa9093160bf6dbd862ac136a805a4e9c760c54d28ac5bf21d509d94e9e437e2e38a13664ec104dadc66f8c21b7b82e3e3570d27326e13df07dd72b6847f8e53aadeafa54cc879cfa2ae3b8028c39df36b097ba65688abadb78a06c16f393L
	#e1 = 0x17e1
	#e2 = 0x43a5
	#c1 = 0xb6e66aa0d4d5ad1460482f45aab87e80a99c1ff3af605fd9cea82d76d464272f3dd2e1797e3fede64cffcd54b2a7a5e21f45574783f62266cebf3cdb9764c6c04b0b30b5d065d5f6142d498506ea1f6449f428253d4d76bd96778d5f58abf313370b980dcb90daf882c5539ac3df81a431bc2c0e0911ecbe5195d94312218b3854ee14f13bd00c81d7ff11c06a9e112940b7377c20e53738a2ebb77b0534d8d9e481e60e9c87693bd9e1fd1e569083479ff8f53e42337a2b799c2325a7e2588fb046cf228d01d8596e7af4570a3cb0635d2524d234e3993d76b7e60f1c478ba45891de5cc0a1fec116f7c0dd9be7aa54226edf0196e37856afca32c69d790e1L
	#c2 = 0x9bcbfea3c3130364bbcf352b7810df031293949ed147919dec3ecfdd48f77e9486ae811d95f8c79eb477f4424d475dc611536343c7e21c427e18593aae37982323f2c0f4e840fbf89b31edc8f79ad7f6511ee0e5605cfbba7ada7d8777e81ec0ac122e0ad5108e97fafc0cd31ed8c83f3e761b92bdbea1144b0c06c5ca43a7b4e9e0a2b15ee12509235c5695be54d9fd0725ac80abbf0f5e8f43539da3ce9464020099e031d8bca899f11638169196ac72aeaeb90dab851d801cf93044cc00dd94d93c8963201b26788a7c42ce45c496c0a597ac53cd55c60b8f38f3f7d1f8ecc2e4e40ba6fe0c6e605ebbfc9aa3da5ab810c783c1d9957bb5d00a89ab1bbdeL
	#print attacksamen(n,e1,e2,c1,c2)
	#print modequation(5,4,12)
	#print modequation(15,11,36)
	letter = 'abcdefghijklmnopqrstuvwxyz'
	word = 'falszztysyjzyjkywjrztyjztyynaryjkyswarztyegyyj'
	flag = ''
	for i in word:
		flag += letter[modequation(7,(ord(i)-97+4)%26,26)]
	print flag


全部评论

相关推荐

11-30 11:07
河南大学 Java
宇宙厂 测开 n*15
丘丘给个offer:有后选后
点赞 评论 收藏
分享
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务