人们常说,用私钥对加密哈希进行RSA加密与签名(签名生成)相同。而且该验证包括使用公钥进行的解密。

RSA私有密钥上的RSA加密是否等同于签名生成?

#1 楼

简短答案

否,使用私钥的RSA加密与RSA签名生成不同。只能根据RSA标准使用RSA公钥来执行RSA加密。

术语“原始RSA”或教科书RSA通常用于表示没有填充方案的RSA。原始RSA仅包含模块化幂运算。原始RSA容易受到许多密码攻击,因此不安全通用。

混乱的根源

人们经常提到签名等同于RSA加密( )使用私钥的消息。仅当您忽略必需的填充机制时,才如此。 RSA填充机制在加密和签名上是不同的。

两者之所以可以混淆的另一个原因是,公钥通常使用用于RSA加密的ASN.1 OID标识:1.2.840.113549.1.1.1{iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) rsaEncryption(1)}。例如,在X.509证书中通常就是这种情况。但是,通常将此OID用作指向PKCS#1规范的通用指针。

深入研究填充方案

PKCS#1 RSA密码规范明确定义了不同的方案用于RSA加密和RSA签名生成。

较早的PKCS#1 v1.5标准包含两个填充方案,这些填充方案通常简称为PKCS#1 v1.5。但是,这些加密和签名方案的填充完全不同,这由它们的正式名称RSAES-PKCS1-v1_5和RSASSA-PKCS1-v1_5反映出来-第一个是加密方案(ES),另一个是签名方案和附录(SSA)。

幸运的是,对于较新的OAEP加密(使用RSAES-OAEP填充)和PSS签名生成方案(使用RSASSA-PSS填充),不会出现由两个具有相同名称的填充方案引起的混淆。因此,即使加密和签名生成依赖相同的机制(称为掩码生成函数或带有一种实现的MGF:MGF1),其填充的名称也有所不同。对于具有公共密钥的RSA加密和使用私有密钥的RSA签名生成,也是如此。通过查看第5.2节的最后部分可以很容易地验证这一点:


每个原语中的主要数学运算是
求幂,如加密和解密一样
5.1节的原语。 RSASP1和RSAVP1与RSADP和RSAEP
相同,只是它们的输入和输出参数的名称不同。区分它们是出于不同目的。


通常,如果另一方正确实施了验证方法,则通过执行RSA加密创建的签名将失败。 br />
但是,如果使用私钥进行加密,则某些软件库实际上会执行RSA填充来生成签名。可能的原因之一是SSL / TLS。 TLS最高为v1.2的TLS版本使用了“签名”,该签名是通过将MD5哈希与SHA-1哈希连接在一起而创建的。这样的方案通常与RSA实现提供的签名生成方法不兼容,因此它们依靠RSA加密例程来神奇地完成正确的事情。

RSA实现说明

许多实现不允许使用私钥加密。通常无法尝试使用私钥来模拟签名生成。公钥操作的实现通常假设一个小的公共指数。此外,他们通常不会应用用于加速私钥操作的中国剩余定理。

请注意,公钥不需要防止信息泄漏,而私钥则应始终保持安全。因此,RSA加密实现(当编程为与公钥一起使用时)可能不包含针对副信道攻击的保护,可能会将私钥暴露给能够进行副信道攻击的攻击者。

#2 楼

这取决于您所说的RSA。如果您是指普通教科书RSA,其中$ P = C ^ d \ bmod n $(使用私钥$ d $解密)和$ S = M ^ d \ bmod n $(签名生成),那么是的,它们是相同的。

但是,教科书RSA本质上是不安全的,并且对于真实的RSA(例如RSA-OAEP +(加密)或RSA-PSS(签名)签名)与解密是不相同的。