RSA加密原理

2024.2.23

密钥对的生成过程

1、随机找两个质数 P Q ,P Q 越大,越安全

本例取 P = 67 ,Q = 71

计算他们的乘积 N = P * Q = 4757

转化为二进为 1001010010101,该加密算法即为 13 位,实际使用中的算法是往往是 1024 位 或 2048 位,位数越长,算法越难被破解

2、计算 N 的欧拉函数 φ(N)  

(注:互质是公约数只有1的两个整数,叫做互质整数)

φ(N) 表示在小于等于 N 的正整数之中,与 N 构成互质关系的数的个数

例如:在 1 8 之中,与 8 形成互质关系的是 1357,所以 φ(n) = 4

如果 N = P * QP Q 均为质数,则
φ(N) = φ(P * Q)= φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1)

本例中 φ(n) = 66 * 70 = 4620,这里记为 TT = φ(N) = 4620 

3、求公钥 E

E的范围:{E | gcd(E,T)=1, 1<E<T } 

讲人话就是 E , T 互质并且 E 大于 1 小于 T

本例取E=17(随便取,不要和T太接近了)

4、求私钥 D

D的范围:{D | E*D%T=1, 1<D<T } 

讲人话就是 E 和 D 的乘积除以 T 的余数等于 1 并且 D 大于 1 小于 T

本例取D=193

5、至此密钥对的生成就完成了

公钥(n,e)=(3403,17)    私钥(n,d)=(3403,193)

 6、加解密过程

加密(假设明文为123

明文^E % N = 123^17 % 3403 = 943

       ↑这里是幂运算,别理解成异或运算了

解密(现在密文就为943

密文^D % N = 943^193 % 3403 = 123

以上文字用 python 的话来讲就是

#先取两个随机的质数
P = int(input("请输入一个质数P:"))
Q = int(input("请输入一个质数Q:"))
N = P*Q

#通过欧拉函数计算与N互质的个数
T = (P-1)*(Q-1)

#取公钥
#找质数,埃拉托斯特尼筛法
primes = [True] * (T + 1)
for p in range(2, int(T**0.5) + 1):
    if primes[p]:
        primes[p*p::p] = [False] * ((T - p*p) // p + 1)
print([p for p in range(2, T + 1) if primes[p]])
E = int(input("请从上面数中选一个作为公钥E:"))

#取私钥
print([i for i in range(2,T) if i*E%T==1])
D = int(input("请从上面数中选一个作为私钥D:"))

#公钥(N,D) 私钥(N,E)
print(f"公钥({N},{E}) 私钥({N},{D})")

#这里演示一下明密文的转化(仅数字)
plaintext = int(input("请输入明文"))
ciphertext = plaintext**E%N
plaintext = ciphertext**D%N 
print(f"密文为:{ciphertext}")
print(f"明文为:{plaintext}")

 

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z时代.bug(゜▽゜*)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值