我想知道 RSA 签名对于数据是否是唯一的。
假设我有一个“hello”字符串。计算 RSA 签名的方法首先是获取 sha1 摘要(我知道,这些是 unqiue 数据),然后添加一个带有 OID 和填充方案的 header ,并做一些数学调整来给出签名。
现在假设填充相同,openSSL 或 Bouncy CaSTLe 生成的签名是否相同?
如果是,我唯一担心的是,找回“文本”/数据不容易吗?
我实际上尝试对某些数据进行 RSA 签名,而 OpenSSL 和 BC 的签名不同。我重复了一遍,但每次都一次又一次地得到相同的签名。我意识到方法的两个签名是不同的,因为填充的不同。但是我仍然不确定为什么每个库的签名在我重复它们的时候都是相同的。有人可以给一个简单的解释吗?
最佳答案
PKCS#1 中描述的“常规”填充方案由于“旧式 v1.5”填充是确定性的。它是这样工作的:
所有这些操作都是确定性的,没有随机性,因此使用相同的 key 和相同的散列函数对相同的数据进行签名将永远产生相同的签名是正常的和预期的。
然而,在基于 ASN.1 的固定报头中存在轻微的规范不足。这是一个标识散列函数的结构,以及该散列函数的“参数”。通常的散列函数不带参数,因此参数应该用特殊的“NULL”值(占用几个字节)表示,或者完全省略:两种表示都是可接受的(尽管前者应该是首选)。因此,原始效果是对于给定的散列函数,有两个版本的“固定 header ”。 OpenSSL 和 BouncycaSTLe 不使用相同的 header 。但是,签名验证者应该接受两者。
PKCS#1 还描述了一种更新的填充方案,称为 PSS,它更复杂但具有更强的安全性证明。 PSS 包含一堆随机字节,因此您每次都会得到一个不同的签名。
关于cryptography - RSA 签名是唯一的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5883451/