from Crypto.Util.number import inverse from gmpy2 import gcdext
defcommon_modulus(e1, e2, n, c1, c2): # 调用扩展的欧几里得算法函数 g, s, t = gcdext(e1, e2) # 求模反元素 if s < 0: s = -s c1 = inverse(c1,n) if t < 0: t = -t c2 = inverse(c2,n) returnpow(c1,s,n)*pow(c2,t,n)%n
结果
1 2
b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00My secre' My secre
公共模数攻与因数碰撞法 frame 0,4;1、18
原理
当系统中不同的消息共用一个模数 N,只有 e 和 d 不同,系统将是危险的,此时,攻击者可能无需分解 N 就能够恢复明文。
前提条件
$gcd(n1,n2)!=1$
$n_1 \neq n_2$
攻击原理 $$ 最大公因数获取其中一个大素数:p = gcd(n1,n2) \ n 除 p 获取另一个大素数:q_i = n_i \div p \quad (i=1 \ or \ 2) \ phi_i(n) = (q_i-1)(p-1) \ d_i = inverse(e_i,n_i) \ m_i \equiv c_i^{d_i} \pmod n_i $$
Frame 1 b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00. Imagin' Frame 18 b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00m A to B'
费马 (Fermat) 分解法:frame 10
原理
为了降低模数 N 被试除法攻破的可能性,算法设计者通常选择具有相同比特大小的参数 p 和 q,然而,如果 p 和 q 太过接近,就可以利用费马分解法找到它们。
from gmpy2 import iroot defFermat_factorization(num): x,flag_x = iroot(num,2) ifpow(x,2)<num: x+=1 whileTrue: temp = pow(x,2) - num y,flag_y = iroot(temp,2) if flag_y: break x+=1 returnint((x+y)),int((x-y))
结果
1 2 3
frame 10 b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00will get' will get
若$p_1,p_2,\cdots,p_n$这些素数是随机在小 s 于 B 的数中选的,那么最大的素数大概率要大于 0.8B
因此在$j<0.8B$之前不计算 gcd,可以节省时间
令$a \equiv a^j \pmod n$
计算$d = gcd(a-1,n)$
如果$1<d<n$, 则返回$d$
步骤
1 2 3 4 5 6 7 8 9 10 11 12 13
from Crypto.Util.number import GCD def pollard_p_1(n,B): a = 2 false_range = int(0.8*B) for j in range(2,false_range): a = pow(a, j, n)
d = 0 for j in range(false_range,B+1): a = pow(a, j, n) d = GCD(a-1, n) if 1<d<n: return d
结果
1 2 3 4 5 6 7 8 9
frame 2 b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 That is'
- 7 b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00amous sa' - 11 b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ying of ' - 15 b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Albert E'
b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t is a f'
语义猜测:frame 2,3,4,9,12,13,14,15
根据已知的明文便可通过猜测 + 穷举的方法恢复出剩余的明文:
1
My secret is a famous saying of Albert Einstein. That is "Logic will get you from A to B. Imagination will take you everywhere."