密码学
密码学
加密方法可以分为两大类。一类是单钥加密(private key cryptography),还有一类叫做双钥加密(public key cryptography)。前者的加密和解密过程都用同一套密码,后者的加密和解密过程用的是两套密码。
历史上,人类传统的加密方法都是前一种,比如二战期间德军用的Enigma电报密码。莫尔斯电码也可以看作是一种私钥加密方法。
在单钥加密的情况下,密钥只有一把,所以密钥的保存变得很重要。一旦密钥泄漏,密码也就被破解。
在双钥加密的情况下,密钥有两把,一把是公开的公钥,还有一把是不公开的私钥。
目前,通用的单钥加密算法为DES(Data Encryption Standard),通用的双钥加密算法为RSA( Rivest-Shamir-Adleman),都产生于上个世纪70年代。
RSA公钥和私钥是什么?
首先来说,RSA是一种非对称加密算法,它是由三位数学家(Rivest、Shamir、Adleman)设计出来的。非对称加密是相对于对称加密而言的。对称加密算法是指加密解密使用的是同一个秘钥,而非对称加密是由两个密钥(公钥、私钥)来进行加密解密的,由此可见非对称加密安全性更高。
公钥顾名思义就是公开的密钥会发放给多个持有人,而私钥是私有密码往往只有一个持有人。
公私钥特性
- 公钥和私钥是一一对应的关系,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立。
- 用公钥可以解开私钥加密的信息,反之亦成立。
- 公钥和私钥都是密钥,被公开的那个就是公钥,没有被公开的那个就是私钥。
- 同时生成公钥和私钥应该相对比较容易,但是从公钥推算出私钥,应该是很困难或者是不可能的。
- 密钥越长,越难破解,所以2048位密钥比1024位密钥要更安全;
公钥和私钥都可用于加密和解密
公钥和私钥都可以用于加解密操作,用公钥加密的数据只能由对应的私钥解密,反之亦然。虽说两者都可用于加
密,但是不同场景使用不同的密钥来加密,规则如下:
-
私钥用于签名、公钥用于验签,起到数字签名作用
签名和加密作用不同,签名并不是为了保密,而是为了保证这个签名是由特定的某个人签名的,而不是被其它人伪造的签名,所以私钥的私有性就适合用在签名用途上。私钥签名后,只能由对应的公钥解密,公钥又是公开的(很多人可持有),所以这些人拿着公钥来解密,解密成功后就能判断出是持有私钥的人做的签名,验证了身份合法性。
-
公钥用于加密、私钥用于解密,起到加密作用
因为公钥是公开的,很多人可以持有公钥。若用私钥加密,那所有持有公钥的人都可以进行解密,这是不安全的!若用公钥加密,那只能由私钥解密,而私钥是私有不公开的,只能由特定的私钥持有人解密,保证的数据的安全性。
所以:在双钥体系中,公钥用来加密信息,私钥用来数字签名。
生成公私钥的规范
因为任何人都可以生成自己的(公钥,私钥)对,所以为了防止有人散布伪造的公钥骗取信任,就需要一个可靠的
第三方机构来生成经过认证的(公钥,私钥)对。目前,世界上最主要的数字服务认证商是位于美国加州的
Verisign公司,它的主要业务就是分发RSA数字证书。
RSA算法
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。、
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA算法加密解密图解

实际场景
场景1:Alice给Bob传递消息
- 比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:
- Bob将他的公开密钥传送给Alice。
- Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
- Bob用他的私人密钥解密Alice的消息。
- 上面的过程可以用下图表示,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。

场景2:Bob收到消息,给Alice回复“收到”
- Alice将回复的消息进行Hash函数操作后,再私钥加密做成数字签名
- Alice将数字签名和回复的消息一起发送给Bob
- Bob公钥解密数字签名,并将回复的消息进行Hash函数操作,比对是否一致
存在的问题
-
因为公钥私钥是成双成对存在的,如果Jack用Alice的电脑删除了之前的公钥,使用自己的公钥,然后Jack不就可以伪造Bob的身份给Alice发送消息了吗?
- 这里就需要证书中心(certificate authority,简称CA)为公钥做认证了。
-
场景2中,私钥加密,公钥解密会发生一个问题。因为公钥是已知的,那么私钥加密后再发送出去还有加密的必要吗?因为公钥是已知的,黑客轻易拿到手,公钥解密后就能拿到信息了。
- 这里就涉及到哈希(Hash)函数的不可逆特性了。
- 1.首先Bob对消息进行哈希函数,生成消息的摘要(digest)。再对摘要使用私钥加密生成数字签名(signature)。然后把消息和数字签名一起发给Alice
- 2.Alice收到消息和数字签名,对数字签名进行公钥解密得到消息的摘要digest。然后对收到的消息进行哈希函数生成另一份摘要digest,如果两个摘要一致,就证明这条消息未被修改过。

参考文档
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
https://blog.csdn.net/21aspnet/article/details/7249401
http://www.ruanyifeng.com/blog/2006/12/notes_on_cryptography.html

浙公网安备 33010602011771号