加密是保持一些数据的机密性;数据被转换成不透明的块,相反的操作需要攻击者不知道的东西,即“秘密”或“私有”信息。加密的整个意义在于,只有公共信息不能进行解密; 因此解密使用私钥。然而,任何人都可以加密数据,这没有问题,因此加密可以使用公钥。
有一些算法(实际上只有一个:RSA),从 casual glance 看起来似乎是“可逆的”:您可以考虑使用私钥进行加密,公钥进行解密。如上所述,保密性就不存在了(如果解密键是公开的,则任何人都可以解密,因此加密的数据不能再被视为机密)。这样的“反向加密”可以用作数字签名算法的基础,在其中没有保密性概念,而是验证密钥所有者行动的可验证证明。
然而,RSA不仅涉及模幂。RSA加密首先通过称为“填充”的操作将输入消息转换为大整数。 RSA签名生成首先通过另一种称为“填充”的操作将输入消息转换为大整数;但 这并不是完全相同的填充。填充对于安全性至关重要,所需特性在加密和签名之间非常不同。例如,加密填充需要高水平的附加随机性,而签名填充需要大量的冗余(和哈希函数,以适应长输入消息)。
将签名称为“使用私钥进行加密”是RSA标准历史上的说法(因此出现了诸如“md5WithRSAEncryption”之类的名称),但这是不准确的(填充是不同的,并且必须是不同的),并且过于具体(它仅适用于RSA,而不适用于El Gamal、DSA、Diffie-Hellman、NTRU…)。这只是一种普遍的混淆。
不仅可以使用公钥进行加密,实际上这是保密加密的正常操作模式。这是有道理的 - 任何人都可以使用公钥进行加密,只有正确的接收者才能使用他们的私钥进行解密。
在许多公钥系统中,签名在数学上类似于相反的情况 - “使用私钥加密” - 但请注意,签名操作从根本上与加密操作不同。例如,在RSA中,签名必须使用不变的、可验证的填充方法,而加密应该使用随机填充。
它是可互换的。
数字签名 -> 私钥加密,公钥解密以验证发送者。
发送消息 -> 公钥加密,私钥解密,所有者读取消息。
编辑:人们似乎不同意“可互换”的定义。我需要澄清的是,我谈论的是操作的数学角度,而不是安全方面的最佳选择。当然,您应该按照其预期操作使用密钥。
然而,Henrick Hellström在SO线程中的回复解释了为什么它们在数学上是可互换的:Are public key and private key interchangeable?