RSA介绍
RSA加密算法是由美国麻省理工学院的3名密码学者Rivest、Shamir、Adleman提出的一种基于大合数因式分解困难性的公共弄开密钥密码。由于它的安全、易懂,因此已成为目前应用最广的公开密钥密码
加密过程
- 随机选择两个大素数p和q,p和q都保密
- 计算n=pq,将n公开
- 计算 φ(n) =(p-1) * (q-1),r=φ(n),r和φ(n)保密
- 随机选取一个正整数e,1<e<r且e与r互素,正常环境下e取65537,其二进制数表示只有两个1,且为素数,将e公开,(n,e)就构成了用户公钥。
- 根据ed≡1 mod r ,(≡表示模同余运算),计算出d,将d,保密。(n,d)就构成了用户私钥
- 加密运算:C=M^e mod n
- 解密运算:M=C^e mod n
RSA参数选择
为确保RSA密码安全,必须认真选择RSA密码参数
- p和q要足够大,n才足够大,才能对抗因式分解
- p和q应为强素数
- p和q的差要大,即|p-q|要大
以下是用python3.X实习的rsa加密算法,可以参考一下
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Hac
import math
import random
#生成素数数组
def prime_array():
arraya = []
for i in range(2,2000):
x = prime(i,2)
if x:
arraya.append(i)
return arraya
#判断是否为素数
def prime(n,test_divisor):
if math.sqrt(n) < test_divisor:
return True
if n % test_divisor == 0:
return False
else:
return prime(n,test_divisor+1)
#互质e
def co_prime(r):
while True:
e = random.choice(range(2000))
if r < e:
x =gcd(e,r)
else:
x = gcd(r,e)
if x == 1:
break
return e
#最大公约数
def gcd(a,b):
if b == 0:
return a
else:
return gcd(b,a % b)
#ed mod r =1
def find_d(e,r):
for d in range(10000000):
x = (e*d) % r
if x == 1:
return d
#生成公钥私钥的基本条件
def test():
a = prime_array()
print("前2000个素数:",a)
p = random.choice(a)
q = random.choice(a)
print("随机抽取两个素数p&q,p=",p,"q=",q)
n = p*q
r = (p-1)*(q-1)#fy
e = co_prime(r)
print("根据互质得到e=",e)
d = find_d(e,r)
print("求到模逆元d,d=",d)
pbvk=(n,e,d)
return pbvk
#生成public key & private key
def generate_pbk_pvk(a,zx):
pbk = (a[0],a[1])
pvk = (a[0],a[2])
print("pbk:",pbk,"pvk;",pvk)
if zx == 0:
return pbk
if zx == 1:
return pvk
#加密
def encryption(mw,ned):
# 密文b = 明文a的e次方 模 n,ned为公钥
#mw为明文a,ned【1】是e,ned【0】是n
B = pow(mw,ned[1]) % ned[0]
return B
#解密
def decode(mw,ned):
C = pow(mw,ned[1]) % ned[0]
return C
if __name__=='__main__':
pbvk = test()
pbk = generate_pbk_pvk(pbvk, 0) #公钥 if 0 return pbk if 1 return pvk
A = int(input("请输入明文(需小于%d): " % pbk[0]))
while A >= pbk[0]:
A = int(input("明文大于%d,请重新输入:" % pbk[0]))
if not A >= pbk[0]:
break
B = encryption(A,pbk) #加密
print("生成的密文是: ", B)
pvk = generate_pbk_pvk(pbvk, 1) #私钥
C = decode(B,pvk) #解密
print("解密后的明文是 : ", C)
if A==C:
print("加密前的明文和解密后的明文一样")
else:
print("加密前的明文和解密后的明文不一样")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
这个代码只是最基础的,只能实现一些数字加密与解密,代码参考熊與猫v如果有什么不足还请大佬们指教