RSA算法就是基于大素数难以分解而得到的一种算法,通过公钥和私钥来进行对数据的加密解密。
- 选择两个大素数p,q。计算
n=p*q
- 计算
s=lcm(p-1,q-1)
,即p-1和q-1的最小公倍数 - 随机选择e,使得
1<e<s
,且gcd(e,s)=1
- 计算e的模逆元
e*x % s = 1(即
de=1 mod (p-1)(q-1)) - 则(n,e)为公钥,(n,d)为私钥
- RSA加解密的算法,设M为明文,C为密文,则:
-
M=C^d mod n;
C=M^e mod n;
代码实现就是直接套公式就可以了。
import random,rabinMiller
def gcd(a, b):
while a != 0:
a, b = b % a, a
return b
def findModInverse(a, m):
if gcd(a,m)!=1:
return None
u1,u2,u3 = 1,0,a
v1,v2,v3 = 0,1,m
while v3!=0:
q=u3//v3
v1, v2, v3,u1,u2,u3=(u1-q*v1), (u2-q*v2), (u3-q*v3),v1, v2, v3
return u1%m
def generateRSAkey(keySize=1024):
p = rabinMiller.generateLargePrime(keySize)
q = rabinMiller.generateLargePrime(keySize)
n = p*q
while True:
e = random.randrange(2 ** (keySize - 1), 2 ** (keySize))
if gcd(e, (p - 1) * (q - 1)) == 1:
break
d = findModInverse(e, (p - 1) * (q - 1))
publicKey = (n, e)
privateKey = (n, d)
print(publicKey)
print(privateKey)
return publicKey,privateKey
if __name__=="__main__":
publicKey, privateKey =generateRSAkey()
msg = 'hello world!'
msg = list(msg.encode('ascii'))
emsg = []
for m in msg:
emsg.append(pow(m, publicKey[1], publicKey[0]))
print(emsg)
dmsg = []
for c in emsg:
dmsg.append(pow(c, privateKey[1], privateKey[0]))
msg_ = bytes(dmsg).decode('ascii')
print(msg_)