RSA加密过程详解

 鲍勃要发消息给爱丽丝 ,那么爱丽丝应该公开一个公钥,使鲍勃根据公钥去加密自己的消息,然后爱丽丝有仅自己知道的私钥来解密鲍勃发的消息。

一、首先:公私钥的生成

  二、举个例子

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,可以得到pq的值为1844349891

现在已知pqe以及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)

结果如图

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值