Python的RSA操作(私钥与公钥)
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA公开密钥密码体制的原理是:
根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥 。
关于RSA的通俗的解释:
使用规定的方法生成一对密钥,一个作为私钥,一个作为公钥;
一段数据通过私钥加密,必须通过公钥解密;反之亦然。
私钥自己保管,公钥对外公开。
比如:理思录的私钥A(理思录),公钥B(理思录)
九赢百信的私钥C(九赢百信),公钥D(九赢百信)
比如:九赢百信希望发送一条信息M给理思录,不希望他人知晓传输的内容,即便获取了数据,也不能解析其中的内容。那么这个人就用公钥B(理思录)去加密这个信息M,变成了X。
当理思录收到了X,就用自己的私钥A(理思录)去解密,解密后才能看到真正的信息M。
这样,理思录可以收到信息M,可是并不知道信息是谁发出的。
为此,信息M在九赢百信发送信息之前,使用自己的私钥C(九赢百信)将信息M加密为N,可以附加自己的公钥信息,然后再通过公钥B(理思录)进行另外一次加密,成为P。
这样,当理思录收到P,之后,先用自己的私钥A(理思录)解密,然后使用公钥D(九赢百信)进行解密。
公钥的公布需要一些类的规定和程序,保证他是可信性。
双钥技术的加密和解密耗费的时间比较大,通常使用这种技术来传输密码,通过密码来解密要传输的数据。
现在用python调用库实现RSA密钥的生成。
安装:pip install rsa
#pip install rsa
import rsa
(pubkey,privkey)=rsa.newkeys(1024)
print(pubkey)
print(privkey)
pub=pubkey.save_pkcs1()
pubfile=open('public.pem','wb')
pubfile.write(pub)
pubfile.close()
pri=privkey.save_pkcs1()
privkey=open('private.pem','wb')
privkey.write(pri)
privkey.close()
生成的文件如下图:
import rsa
# rsa加密
def rsaEncrypt(str):
# 生成公钥、私钥
(pubkey, privkey) = rsa.newkeys(512)
print("公钥:\n%s\n私钥:\n:%s" % (pubkey, privkey))
# 明文编码格式
content = str.encode("utf-8")
# 公钥加密
crypto = rsa.encrypt(content, pubkey)
return (crypto, privkey)
# rsa解密
def rsaDecrypt(str, pk):
# 私钥解密
content = rsa.decrypt(str, pk)
con = content.decode("utf-8")
return con
if __name__ == "__main__":
str, pk = rsaEncrypt("hello")
print("加密后密文:\n%s" % str)
content = rsaDecrypt(str, pk)
print("解密后明文:\n%s" % content)
===================== RESTART: E:/python code/其他/RSA_T01.py ====================
公钥:
PublicKey(9111873236249849209686819369076356655660892337807985520901675955833176249049269417595657300043866173262409777435981355116449943828841734063225123542228361, 65537)
私钥:
:PrivateKey(9111873236249849209686819369076356655660892337807985520901675955833176249049269417595657300043866173262409777435981355116449943828841734063225123542228361, 65537, 2265976623958985648099177290342958340692451948084205075295718673850940787996298407753473721435820250048228469715958524626179351450461377903271599676389673, 5159625978049603036154695303556767905690916535211950049558224975601481091096127691, 1765994914168999577067848938883684661085876986183189630983114088404405371)
加密后密文:
b'f\xbe\xb8\xfd\xa9#\n\x98\xc3\xc0{\xd0n\x17\x10\xfb^\xfd\xdf(\xb41\x1e\x06Ij\xd8\x9a\xd2P\xc2]H\xa4\xeb$\xbd+}b\xd4\x1a \xfb\xee:E\xd0r\x0e\xdcH\xb0v\xd8\xc4\xb1\x94Q\xda,\xc2\xbd\xdd'
解密后明文:
hello