零:认识
如果没有 RSA 算法,现在的网络世界毫无安全可言,也不可能有现在的网上交易。上一篇文章 ssh 协议为什么安全 中的 ssh 协议也是基于 RSA 加密算法才能确保通讯是加密的,可靠的。
1976年以前,所有的加密方法都使用对称加密算法:加密和解密使用同一套规则。例如:甲使用密钥 A 加密,将密文传递给乙,乙仍使用密钥 A 解密。如果密钥 A 在甲传递给乙的过程中泄露,或者根据已知的几次密文和明文推导出密钥 A,则甲乙之间的通讯将毫无秘密。
1976年,两位美国计算机学家 Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不传递密钥的情况下,完成解密。这被称为 Diffie-Hellman密钥交换算法
假如甲要和乙通讯,甲使用公钥 A 加密,将密文传递给乙,乙使用私钥 B 解密得到明文。其中公钥在网络上传递,私钥只有乙自己拥有,不在网络上传递,这样即使知道了公钥 A 也无法解密。反过来通讯也一样。只要私钥不泄漏,通信就是安全的,这就是非对称加密算法。1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。算法用他们三个人的名字命名,叫做 RSA 算法。直到现在,RSA 算法仍是最广泛使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有 RSA 算法。
一:python RSA-package
#生成秘钥和私钥 import rsa (pubkey, privkey) = rsa.newkeys(512)
#加密和解密 import rsa #1 #bob create public_key and private_key (bob_pubkey, bob_privkey) = rsa.newkeys(512) #2 #alice get the public_key from bob and use public_key to send message to bob message = "hello bob".encode("utf-8") crypto = rsa.encrypt(message, bob_pubkey) #3 #bob recv the message and use his private_key to read the message message = rsa.decrypt(crypto, bob_privkey) print(message.decode("utf-8")) #RSA只能加密 比RSA编码程度小的数据;例如,一个512位密钥可以编码一个53字节的消息 #(512位= 64字节,其中11个字节用于随机填充和其他填充)
#保存私钥和公钥 #读取私钥和公钥 #write import rsa (pubkey, privkey) = rsa.newkeys(512) pub_pkcs = pubkey.save_pkcs1() pubfile = open('public.pem', 'wb+') pubfile.write(pub_pkcs) pubfile.close() priv_pkcs = privkey.save_pkcs1() prifile = open('private.pem', 'wb+') prifile.write(priv_pkcs) prifile.close() #read import rsa with open('public.pem') as publickfile: p = publickfile.read() pubkey = rsa.PublicKey.load_pkcs1(p) print(pubkey) with open('private.pem') as privatefile: p = privatefile.read() privkey = rsa.PrivateKey.load_pkcs1(p) print(privkey)
#签名 和 验证 # 理解:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html # 对message 通过加密生成 digest # 再利用私钥对digest加密生成signature # 将message + signature传送数据 # sign message = 'Go left at the blue tree'.encode("utf-8") hash = rsa.compute_hash(message, 'SHA-1') signature = rsa.sign_hash(hash, private_key, 'SHA-1') print(signature) #verify try: message = 'Go left at the blue tree'.encode("utf-8") tof = rsa.verify(message, signature, public_key) print(tof) except Exception: print("verify wrong")
python RSA
最新推荐文章于 2024-08-08 08:57:17 发布