私钥加密公钥解密,称之为签名。签名的目的是验证消息发送者的身份,杜绝伪造。因为私钥只有消息发送者有,所以只有发送者才能制造消息。因为是公钥,谁都可以解密,所以签名不是为了保密,而是为了验证身份。
公钥加密私钥解密,称之为加密,也就是把明文变为加密文,只有接收者才能解读内容。原理很简单,需要通讯的时候接收者把公钥发给发送者(不怕泄漏,要不怎么叫公钥),发送者用公钥加密,把秘文发给接受者,半路上被截获了也没用,因为要解密需要私钥,而私钥只有接收者有。
很遗憾, @Serendipity 的回答是错误的,任何时候都是用公钥加密,用私钥解密。
为什么呢?因为我们说的是加密和解密,而不是其他的。
加解密的目的是保证信息的私密性,而不是其他的。也就是说,只要我有一个消息 ,我用一个密钥 把它变成了 ,你从 里得不到 的任何信息,然后我通过 和 能把 恢复出来就皆大欢喜了。老早的时候 ,叫对称加密;现在 和 可以不相等,就叫非对称加密。
在非对称加密中, 和 必然是成对出现的。我生成了一对之后,会公开 ,自己留着 .这样别人给我发的消息用 加密,只有我能用 解密,很完美。
在任何时候,我都不会用 去加密,让别人用 解密,因为这毫无意义。
有人会说,这可以证明你是你啊,别人没有私钥,就无法加密,你证明了你有私钥。
这种说法,从原则上说是对的,但现实中没有这么用的。同样的功能,我们用一个叫作“数字签名”的密码原语来实现。
数字签名是建立在非对称的基础上的。也就是说每个使用者都会有一对密钥,它会公开公钥,自己保存私钥。当他需要证明他认可一个消息 时,他会用签名算法和自己的私钥 对 进行签名,得到签名结果 。而其他人则根据消息 ,签名 和公钥 来验证,得到一比特信息(也就是1或0,代表验证成功或失败)。
(在这里有必要强调一下,签名无法恢复出任何关于消息的信息,即使你通过hash操作把消息映射成了一个很短的字符串,你也无法恢复这段字符串——或至少,签名算法不保证你能恢复)
注意,验证签名的算法是需要原始的消息作为输入的,它的输出只包含1比特。数字签名 无法恢复消息 ,只有 作为一个三元组输入时,我们才知道它们是不是匹配的。
注意到我们也可以用非对称加密方案设计一个签名方案:签名过程是用私钥加密,验证过程则是用公钥对签名解密,再和消息作对比。若相等则输出1,否则输出0。这说明用私钥加密比数字签名范围更小,它是一种特殊的签名构造方式。当我们面对“验证身份”这类问题时,我们求助的是数字签名方案,而非私钥加密。就好像张三胃病犯了,他求助的可以是任何一个医院的肠胃科大夫,而不一定是XX医院那个叫罗翔的肠胃科大夫,他也可以求助YY医院的李四。
而在实际中,常用的签名方案没有任何一种是通过用私钥加密这种方式实现的(RSA可以算是,但不完全是),所以你可以认为,任何情况下都不会用私钥加密。(其实Full Domain Hash的签名是这样的,但其Hash函数属于签名的一部分,因此也很难说是在用私钥加密)
这里随便举一个常用的数字签名:Schnor签名。
密钥生成就是找一个群,然后生成群元素 ,正整数 ,计算 . 以及群是公钥, 是私钥。
对于一个消息 ,随机生成一个正整数 ,计算 ,然后再计算 。其中 是个哈希算法, 是消息,两个竖线代表拼接。再算出 。签名就是三元组
验证时,只需要先算出 ,再验证 是否成立即可。
注意这里的验签虽然是在比较两个哈希值,但这个哈希算法不是对消息的那个哈希,而是签名算法的一部分。换句话说,即使把上述所有的消息换成消息的哈希 ,上述签名算法同样不是恢复出 再进行比较的。
最后一部分清楚地解释了这个问题。
突然发现Katz的名著《Introduction to Modern Cryptography》里解释得很清楚:
首先,我们来看看RSA的故事
RSA,是最流行的非对称加密算法之一,也被称为公钥加密。其是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。
也正因如此,“RSA”这个名字就是以他们三人姓氏开头字母拼在一起而组成的。
RSA是基于「大整数分解」这一数学困难问题的公钥密码体制,也就是说,对两个质数相乘容易,而将其合数分解很难。[1]
例如,随机选取两个质数 ,令 ,那么,已知 求 很简单,而已知 求 则难度极高,RSA公钥体系正是基于这个数学难题来构建的。
其密钥的产生过程为:
另外,大素数 和 也不是说随便选的,首先得大,而且不能相邻,否则会存在快速分解算法去破解 ,其次对 和 也有相应的要求。
RAS公钥加密算法是基于一个简单的数论事实,即将两个大的质数相乘很容易得到乘积,但要把乘积进行因式分解却非常困难。
那么,基于未被解决的「大整数分解」这一数学困难问题,我们很容易成批量的构造出公私钥对,来构造非对称加密。
RSA算法中,非对称加密信息分为两部分,如公钥 和私钥 。
通过公钥加密的信息可以用私钥 进行解密,反之通过私钥 加密的信息也可以通过公钥进行解密。通常这对秘钥可以叫做公钥和私钥,公钥对外发布,私钥自己保留,从而在信息不对称的情况下实现加密和认证。
上述步骤中得到的公钥 是对外公开的,被其加密的信息,只有拥有私钥的唯一用户才可以解密。而私钥 则是仅用户知道的,被其所加密的信息,所有用户都可用其公开的密钥进行解密。
因此,非对称加密主要有两个作用:
举例两个小故事来看看,都是关于https协议的,先来看第一个。
RSA无论是加密还是解密[2],一般都是要比同长度的AES慢很多的,因此,两端传输一般还是优先用对称密码来加密,多端的话把公钥公开出去,用来验证自己的身份来传输数据。
那么,通信双方用什么方式来传递AES密钥呢?
首先应该否决掉的,就是密钥通过明文方式来传输。
那么,接下来,就很容易再造SSL/TLS轮子了,即先用RSA来加密对称算法的密钥,然后通信双方再通过对称算法密钥来进行大量的信息传输工作,下面讲讲具体流程。
首先,由接收方创建RSA密钥对,接收方通过网络发送RSA公钥到发送方,同时保存RSA私钥。
而发送方创建AES密钥,并利用该AES密钥加密待传送的明文数据,同时使用接受的RSA公钥加密AES密钥,最后把用RSA公钥加密后的AES密钥同密文一起通过网络发送给接收方,来传输隐私数据。。
而对方则用发送方公开的公钥来解密,检验其身份的唯一性。确认发送方身份为该公开公钥的私钥持有者以后,则用双方约定的AES来进行加密。
即,先用RSA来加密对称算法的密钥,然后通信双方再通过对称算法密钥来进行大量的信息传输工作。
这里就可以看到公钥加密的作用:传输隐私信息,例如用公钥来加密AES密钥和需要保密传输的明文数据。(RSA密钥交换+对称加密)
接着,我们来看看第二个故事
完成上述步骤之后,事情开始有所好转,对称加密算法的密钥安全问题得到了解决(利用公钥算法来传输AES密钥),通信双方的数据安全问题也得到了解决(AES加密),甚至性能问题同样得到了解决(因为使用对称算法来加密)。
但还有一个棘手的问题紧接着就来了,你如何保证数据传输通道的安全性?如何避免中间人截取数据来进行攻击? [3]
如果在沟通建立之初的三次握手阶段遭遇到了中间人攻击,那么攻击者将截获服务器的非对称密钥以及通信双方用于加密数据的对称密钥,到了这一步,之后双方的所有明文通信数据在攻击者面前都将一览无余。
到这里,你可能就需要CA证书了,通过内置于操作系统当中的根证书以及由层层信任关系组成的CA证书体系,来防范中间人攻击的发生。
为了防止证书被篡改,需要先对其做一次HASH,再用CA的私钥加密,这样一来就得到了数字签名,然后将其附在证书的末尾。由于做了哈希操作,防止有人篡改证书,而想要验证信息是否被中间第三方劫持,则只需要通过公开的CA公钥来解开HASH,再和自己计算的HASH做对比,即可知道信息是否被篡改,通信过程是否已被第三方劫持。
这里就可以看到私钥加密的作用:认证对方的合法性,任何拥有CA公钥的个体,都可以解开数字签名,来验证信息是否安全可信。(数字证书+RSA密钥交换+对称加密)
以上,谢谢~