鲍勃要发消息给爱丽丝 ,那么爱丽丝应该公开一个公钥,使鲍勃根据公钥去加密自己的消息,然后爱丽丝有仅自己知道的私钥来解密鲍勃发的消息。
一、首先:公私钥的生成
二、举个例子
S1: p=3,q=11
S2: n=p*q=3*11=33
S3: 欧拉n=(p-1)(q-1)=2*10=20
S4: 选一个e=3(1<e<欧拉n,且与欧拉n互质)
S5: de mod 欧拉n=1 d*3 mod 20=1 d=7
S6:公钥: KU=(e,n)=(3,33)
私钥: KR=(d,n)=(7,33)
假如发送的数据M=20
加密:M^e mod n=20^3 mod 33=14=C=密文
解密:C^d mod n=14^7 mod 33=20
为了接下来写脚本,我们简化笔记进行理解
S1: p、q
S2: N = p * q
S3: φn=(p-1)(q-1)
S4:e * d ≡ 1 (mod φ)
S5: de mod φn=1
S6:公钥: KU=(e,n)=(3,33)
私钥: KR=(d,n)=(7,33)
if M=20
加密:c = pow(m, e, N)
M^e mod n
解密:m = pow(c, d, N
C^d mod n
下面举例一道ctf的题目
{920139713,19}
704796792
752211152
274704164
18414022
368270835
483295235
263072905
459788476
483295235
459788476
663551792
475206804
459788476
428313374
475206804
459788476
425392137
704796792
458265677
341524652
483295235
534149509
425392137
428313374
425392137
341524652
458265677
263072905
483295235
828509797
341524652
425392137
475206804
428313374
483295235
475206804
459788476
306220148
题目中的 920139713=p*q=n 19=e 下面一长串是密文m
用网站factordb.com将n分解成p和q,可以得到p
和q
的值为18443
和49891
现在已知p
、q
、e
以及c,
可以通过前三个参数求出d
import gmpy2
p = gmpy2.mpz(18443)#初始化大整数
q = gmpy2.mpz(49891)
e = gmpy2.mpz(19)
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)#invert(x,m)返回y使得x * y == 1 modulo m,如果不存在y,则返回0
print("p=%s,q=%s,e=%s"%(p,q,e))
print("d is:\n%s"%d)
已经求出p,q,e,d,n,c,然后可以求出相应的明文M
#求明文
import gmpy2
n = 920139713
d = 96849619
c = """
704796792
752211152
274704164
18414022
368270835
483295235
263072905
459788476
483295235
459788476
663551792
475206804
459788476
428313374
475206804
459788476
425392137
704796792
458265677
341524652
483295235
534149509
425392137
428313374
425392137
341524652
458265677
263072905
483295235
828509797
341524652
425392137
475206804
428313374
483295235
475206804
459788476
306220148
"""
result = ""
c_list = c.split()
#print(c_list)
for i in c_list:
result += chr(pow(int(i),d,n))
print(result)
结果如图