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 形成互质关系的是 1、3、5、7,所以 φ(n) = 4
如果 N = P * Q,P 与 Q 均为质数,则
φ(N) = φ(P * Q)= φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1)
本例中 φ(n) = 66 * 70 = 4620,这里记为 T, T = φ(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}")