RSA是一种使用不同的加密密钥与解密密钥的公钥密码体制,其命名是由提出该理论的的三人姓氏开头字母拼在一起组成。
公钥与私钥
RSA成对生成私钥与公钥,一把私钥对应一把公钥。而我们经常听到一个私钥对于多个公钥,私钥只能由一个人所拥有,而公钥可以复制多份给不同的人,本质上还是一对一关系。
公钥和私钥都可以用来加密或者解密,即公钥加密的内容只能被对应的私钥进行解密,私钥加密的内容只能被对应的公钥进行解密,这是由算法特性所决定。
在加密时,一般使用公钥加密,私钥解密。这样可以保证只有私钥的人才能去解密内容。那么反之,私钥加密,公钥解密在算法上也是成立的,但是在现实中不能这么用。因为,加密必定是想要给特定的人看,而公钥是可以复制传播、公开的,这样会导致所有拥有公钥的人都可以解密内容。
所以“私钥加密,公钥解密”不能作为加密方法,但是可以用来确认身份,称之为“签名”。
公钥加密,私钥解密
经典的加解密操作过程就是使用收信方的公钥加密,收信方的私钥解密,如下面的例子。
假设Alice向Bob发送私密信件,需要加密内容,则:
- Bob生成一对公钥和私钥。
- Bob传递自己的公钥给Alice,Alice用Bob的公钥对消息内容进行加密。
- Bob接收到Alice加密的消息,利用自己的私钥对消息进行解密。
这个过程中,有两次传递过程,Bob的公钥和加密内容,即使都被不怀好意的人截获,也不会泄露消息。
但同时有个问题,就是Bob无法知晓该信件是否是由Alice发出的,即无法确定信息来源身份。
私钥加密,公钥解密
假设上述例子中使用不同加密的操作,Alice使用自己的私钥加密内容,然后向Bob发送消息。(发信方私钥加密,发信方公钥解密)。
由于使用Alice的私钥加密过的内容,只能用Alice的公钥去解密,而世界上只有Alice拥有Alice自己的私钥,所以可以确认Alice身份。所以,当Bob收到信后需要使用Alice的公钥去解密,如果解密成功,那么说明这个加密内容来自于Alice,这就是签名的基本原理。
但是,现实情况中这样只是这样加密太不安全了,加密内容只需使用公钥就可以解开,就等于完全公开。需要增加改进方案:就是使用Bob的公钥再加密一次,这样是为了只让Bob看,因为只有用Bob的私钥才能解开。那么这条信息相当于加了两次密,第一次加密时确保发信人是Alice(核对签名),第二次加密,是保证只有Bob能解开(信息保护)。
RSA签名过程示例:
签名过程:
Alice将内容进行hash得到消息摘要,并使用私钥对消息摘要进行加密,生成签名。
Alice使用Bob发来的公钥对“摘要+签名”加密,得到密文,并发送给Bob。
验签过程:
Bob使用自己的私钥对密文解密,获得明文消息摘要和签名。
Bob数据偶Alice的公钥解密数字签名,获得消息摘要。
Bob用相同的方案计算消息摘要,并与上一步获得的消息摘要对比,如果相关则验签成功。