python - RSA的加密和解密
关于RSA非对称加密算法的完整原理和逻辑部分,可以参考维基百科。
这里只介绍关于RSA加密解密的最少必要知识:
1加解密的流程:
首先由RSA库生成密钥,注意,这里的密钥包含私钥和公钥,是三个不同的概念。
要加密的内容,称为明文。
加密后的内容,称为密文。
设有一个场景:
翠花要写情书(明文)给二狗,但是情书又不能被人发现,于是就采用了RSA加密的方式来传递情书。
二狗先用RSA生成了一对密钥(有一个公钥,和一个私钥),翠花拿走公钥对情书A(明文)进行加密,生成情书B(密文)。二狗拿到情书B后,用手上的密钥,破解了B,把B还原为原来的A。这样一来,其他人因为没有私钥,无法查看他们之间的甜言蜜语,只有二狗一个人,知道其中的秘密。
这就是RSA加密作用。本质是,不让第三者看到原来信息的内容。
再设一个场景:
二狗要给翠花写情书,告诉她今晚12点村头桥下约会,那么,如何让翠花知道情书真是二狗写的呢。注意,二狗手上有私钥,翠花手上有公钥。这时,二狗把情书用私钥进行签名,带着签名和情书内容一同寄出给翠花,翠花拿着私钥验证签名,发现确实是二狗写的,怎么一来,她就完全可以相信情书的内容了。
这里的签名,本质上,是在允许信息内容别第三者发现的情况下,为了让信息接受者可以验证信息的真实性。
这就是RSA签名的作用。
总结一下:
场景一:公钥加密,私钥解密
场景二:公钥签名,私钥验证。
代码实现:
首先,生成一对密钥,并保存:
import rsa
def create_keys(): # 生成公钥和私钥
(pubkey, privkey) = rsa.newkeys(1024)
pub = pubkey.save_pkcs1()
with open('public.pem','wb+')as f:
f.write(pub)
pri = privkey.save_pkcs1()
with open('private.pem','wb+')as f:
f.write(pri)
对信息进行加密和解密的过程:
import rsa
def encrypt(): # 用公钥加密
with open('public.pem', 'rb') as publickfile:
p = publickfile.read()
pubkey = rsa.PublicKey.load_pkcs1(p)
original_text = 'have a good time'.encode('utf8')
crypt_text = rsa.encrypt(original_text, pubkey)
print(crypt_text)
return crypt_text # 加密后的密文
def decrypt(crypt_text): # 用私钥解密
with open('private.pem', 'rb') as privatefile:
p = privatefile.read()
privkey = rsa.PrivateKey.load_pkcs1(p)
lase_text = rsa.decrypt(crypt_text, privkey).decode() # 注意,这里如果结果是bytes类型,就需要进行decode()转化为str
print(lase_text)
if __name__ == '__main__':
crypt_text = encrypt()
lase_text = decrypt(crypt_text)