对称加密 和 非对称加密 的基本定义来源于维基百科,请参考文献1和2。
对称密钥加密
Symmetric-key algorithm,又称对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。实际上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通讯联系[1]。与公开密钥加密相比,要求双方取得相同的密钥是对称密钥加密的主要缺点之一。常见的对称加密算法DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
公开密钥加密
Public-key cryptography,又为非对称(密钥)加密,该思想最早由雷夫·莫寇(Ralph C. Merkle)在1974年提出,之后在1976年。狄菲(Whitfield Diffie)与赫尔曼(Martin Hellman)两位学者以单向函数与单向暗门函数为基础,为发讯与收讯的两方创建密钥。
非对称密钥,是指一对加密密钥与解密密钥,这两个密钥是数学相关,用加密密钥加密后只能用解密密钥解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。
- 如果加密密钥是公开的,这用于客户给私钥所有者上传加密的数据,这被称作为公开密钥加密。例如,网络银行的客户发给银行网站的账户操作的加密数据。
- 如果解密密钥是公开的,即私钥加密的信息,可以用公钥对其解密。客户可以验证持有私钥一方发布的数据或文件是完整准确的,接收者由此可判定这条信息确实来自于拥有私钥的某人,这被称作数字签名,公钥的形式就是数字证书。例如,从网上下载的安装程序,一般都带有程序制作者的数字签名,可以证明该程序的确是该作者(公司)发布的而不是第三方伪造的且未被篡改过(身份认证/验证)。
常见的公钥加密算法有: RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法(英语:Elliptic Curve Cryptography, ECC)。使用最广泛的是RSA算法(由发明者Rivest、Shmir和Adleman姓氏首字母缩写而来)是著名的公开金钥加密算法。
P.S. 关于数字签名,请参考一篇好的博文, 猛击我。
RSA加密算法
RSA算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。尽管如此,只有一些RSA算法的变种被证明为其安全性依赖于因数分解。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。
下面,我们给我一个Python RSA的demo程序。代码来源于http://stuvel.eu/files/python-rsa-doc/usage.html手册。首先,我们产生一对公钥和私钥。然后,对message用公钥加密,再用私钥进行解密。 注意,如果我们用私钥对message加密,再用公钥解密将会出错。我们用私钥和安全散列算法SHA-1对message进行数字签名,之后再用公钥验证签名。
# -*- coding: utf-8 -*-
import rsa
# 先生成一对密钥,然后保存.pem格式文件,当然也可以直接使用
(pubkey, privkey) = rsa.newkeys(1024)
print pubkey
print privkey
message = 'Hello RSA!!'
# 用公钥加密、再用私钥解密
crypto = rsa.encrypt(message, pubkey)
message = rsa.decrypt(crypto, privkey)
print message
# sign 用私钥签名、再用公钥验证签名
signature = rsa.sign(message, privkey, 'SHA-1') #SHA, Secure Hash Algorithm 安全散列算法
rsa.verify(message, signature, pubkey)
rsa.verify('Hello', signature, pubkey)
1,对称密钥加密
2,公开密钥加密
3, http://pypi.python.org/pypi/rsa
4,http://stuvel.eu/files/python-rsa-doc/usage.html
5, https://pypi.python.org/pypi/pyasn1/0.1.7