前言
前几篇博文分别介绍了对称加密、消息验证码和数字签名,本文将介绍公钥加密(非对称加密)的应用示例。为什么会有公钥加密呢?考虑对称加密模型,一个k 个用户的网络需要存储 k(k-1)/2 对秘钥;而公钥加密模型,则只需要存储k 个公钥,k 个私钥。
混合加密
对称加密算法计算效率比公钥加密明显要高,对于充分长的消息,可以通过混合加密组合达到应用效果。当传递一个消息m 时:
(1)发送方先选择一个随机的对称密钥k ,然后用接收方的公钥pk 加密k,得到密文c1;接收方利用自己的私钥sk 解密c1 得到k。
(2)通信双方利用k 对m 使用对称加密算法。
混合加密算法的安全性证明依赖于∏和∏'的安全性(参考下图),这里不作深入。
应用模型
假如现在 Alice 向 Bob 传送信息m ,为了保证信息传送的保密性、真实性、完整性和不可否认性,采用混合加密,其传送过程为:
Alice 准备好要传送的数字信息m (明文)
Alice 对数字信息进行Hash 运算(md5),得到一个信息摘要(消息验证码)h
Alice 用自己的私钥sk 对h 进行加密得到数字签名σ
Alice 随机产生一个对称加密密钥k ,利用k 对m 进行AES加密形成密文c
Alice 用 Bob 的公钥pk' 对k 进行加密,得到密文c'
Alice 将(c' ,c,σ )发送给Bob
Bob 用自己的私钥sk' 对加密的c' 进行解密,得到k
Bob 用k 对收到的密文c 进行解密得到m
Bob 计算m 的消息摘要h
Bob 用 Alice 的公钥pk 验证数字签名Vrfy(h, σ)
若Vrfy 算法输出True,则验证了消息的真实性、完整性,同时保证了不可否认性。
RSA加密
这里直接给出Python的RSA加密示例
KeyGen.py
#!/usr/bin/python
#coding=utf-8
from Crypto.PublicKey import RSA
rsa = RSA.generate(1024)
privatekey = rsa.exportKey()
with open('privatekey.pem', 'w') as f:
f.write(privatekey)
publickey = rsa.publickey().exportKey()
with open('publickey.pem', 'w') as f:
f.write(publickey)
Encrypt.py
#!/usr/bin/python
#coding=utf-8
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
publickey = RSA.importKey(open('publickey.pem').read())
enc = PKCS1_v1_5.new(publickey)
ciphertext = enc.encrypt("Thank you mom")
import base64
with open("ciphertext", 'w') as f:
f.write(base64.encodestring(ciphertext))
Decrypt.py
#!/usr/bin/python
#coding=utf-8
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
key = RSA.importKey(open('privatekey.pem').read())
dec = PKCS1_v1_5.new(key)
with open('ciphertext', 'r') as f:
ciphertext = f.read()
import base64
ciphertext = base64.decodestring(ciphertext)
from Crypto import Random
print dec.decrypt(ciphertext, Random.new().read)