在RSA中,您基本上有两个解密和加密产品的素数。通常,您将私有解密密钥和公开加密加密,但是对于CA签名验证,角色被逆转 - CA对签名进行加密并将浏览器解密,因此解密密钥是公开的。这意味着这两个素数是公开的,一旦他们知道,每个人都可以将它们繁殖在一起,并将他们的肮脏手放在超级秘密的CA私钥上。我在这里缺少什么?
通常,您会将解密密钥和公开加密进行公开,但是对于CA签名验证,角色被逆转 - CA对签名进行加密和浏览器解密,因此解密密钥是公开的。
使用仅使用服务器已知的私钥在服务器端完成签名。签名由客户使用公共密钥验证。这意味着只有公共密钥是公开的,而私钥在服务器上保持秘密。
这意味着您假设两个素数都是公开的。
ca加密签名并浏览器解密,因此解密密钥是公共的
no,带有私钥的消息 ;其他人可以使用公共密钥验证消息。
我在这里缺少什么?
混乱可能来自许多人学习签名的工作方式,特别是因为他们了解了RSA的"加密"。是m^e % n
和"解密"是m^d % n
。然后,您将了解"签名"。是由m^d % n
和"验证"完成的私有键盘键。通过执行m^e % n
并将预期结果与消息的消化进行比较来完成。结论:签名==解密。
您被教导的原因是,如果您使用的是"明智",那么RSA是一种很难在纸上进行(甚至很难为计算机编写)的算法(甚至很难编写)。有效载荷尺寸(即任何足够大的尺寸,甚至可以容纳MD5哈希(128位),这将需要最小的密钥大小为216位,从而使MODEXP使用5.26e64 < d < 1.06e65
)
用于RSA加密(PKCS#1 v1.5填充),您可以采用原始消息字节,并用
进行预处理- 0x00
- 0x02
- (n.length -m.length -3)随机非零值(其中最低8个)
- 0x00
因此,加密实际上是 (00 02 padding 00 m)^e % n
;或更一般的pad(m)^e % n
(另一个加密填充选项,OAEP,效果非常不同)。现在解密会逆转,并变为depad(m^d % n)
。
签名,另一方面使用不同的填充:
计算
T = DER-Encode(SEQUENCE(hashAlgorithmIdentifier, hash(m)))
构造
- 0x00
- 0x01
- (n.length -t.length -3)零值填充字节
- 0x00
- t
再次,更通用的形式只是 pad(m)^d % n
。(RSA签名具有第二个填充模式,称为PSS,这完全不同)
现在签名验证偏差。公式是verify(m^e % n)
。PKCS#1签名填充(RSASSA-PKCS1-V1_5)的最简单,最正确的形式是:
- 再次运行签名填充公式。
- 验证所有字节是否与公共密钥操作的输出所产生的字节相同。
PSS验证截然不同。PSS填充a)添加了PKCS#1-Signature Padding没有的随机性,b)具有验证公式,仅揭示"正确"或"不正确"不透露预期的消息应该是什么。
因此,私钥始终是(n, d)
,公共密钥始终是(n, e)
。签名和解密并不是真的一样(但它们都涉及"私钥操作"。(也可以将私钥视为三重态(p, q, e)
或五重奏(p, q, dp, dq, qInv)
,但让我们保持简单:)
有关更多信息,请参见RFC 8017,这是RSA规范的最新版本(包括OAEP和PSS,以及PKCS#1加密和PKCS#1签名)。
通常,您将解密密钥私有和公开加密,但是对于CA签名验证,角色是逆转的 - CA对签名进行加密和浏览器解密,因此解密密钥是公开的。
否。签名用私钥签名,并用公共密钥进行验证。就隐私而言,钥匙没有逆转。如果有的话,数字签名将毫无价值,而不是具有法律约束力。
这意味着两个素数是公共的
不,
我在这里缺少什么?
大部分。
ca是处理数字证书的信任权。在RSA数字签名中,您可以使用私钥签名和公共密钥来验证签名。您的浏览器具有所有主要CAS的公共钥匙。浏览器使用此公共密钥来验证可信赖的CA签名的Web服务器的数字证书。因此,私钥不是公开的,您无法妥协。您可以进行简单的Google搜索以清楚了解CA和数字证书。