6

我想知道 RSA 签名对于数据是否是唯一的。

假设我有一个“hello”字符串。计算 RSA 签名的方法是首先获取 sha1 摘要(我知道,这些是 unqiue 数据),然后添加一个带有 OID 和填充方案的标头,并做一些数学调整来给出签名。

现在假设填充相同,openSSL 或 Bouncy Castle 生成的签名是否相同?

如果是,我唯一担心的是,找回“文本”/数据不容易吗?

我实际上尝试对某些数据进行 RSA 签名,而 OpenSSL 和 BC 的签名不同。我重复了一遍,但每次都一次又一次地得到相同的签名。我意识到方法的两个签名是不同的,因为填充的不同。但是我仍然不确定为什么每个库的签名在我重复它们的时候都是相同的。有人可以给一个简单的解释吗?

4

3 回答 3

14

在PKCS#1中描述为“旧式 v1.5”填充的“通常”填充方案是确定性的。它是这样工作的:

  • 要签名的数据经过哈希处理(例如使用 SHA-1)。
  • 增加了一个固定的头部;该标头实际上是一个 ASN.1 结构,用于标识刚刚用于处理数据的散列函数。
  • 添加填充字节(在左侧):0x00,然后是 0x01,然后是一些 0xFF 字节,然后是 0x00。调整 0xFF 字节的数量,以便得到的总长度正好是模数的字节长度(即 1024 位 RSA 密钥的 128 个字节)。
  • 填充值转换为整数(小于模数),该整数通过 RSA 核心的模幂运算。结果被转换回字节序列,这就是签名。

所有这些操作都是确定性的,没有随机性,因此使用相同的密钥和相同的散列函数对相同的数据进行签名将永远产生相同的签名是正常的和预期的。

然而,在基于 ASN.1 的固定报头中存在轻微的规范不足。这是一个标识散列函数的结构,以及该散列函数的“参数”。通常的散列函数不带参数,因此参数应该用特殊的“NULL”值(占用几个字节)表示,或者完全省略:两种表示都是可接受的(尽管前者应该是首选)。因此,原始效果是对于给定的散列函数,有两个版本的“固定标头”。OpenSSL 和 Bouncycastle 不使用相同的标头。但是,签名验证者应该接受两者。

PKCS#1 还描述了一种更新的填充方案,称为 PSS,它更复杂但具有更强的安全性证明。PSS 包含一堆随机字节,因此您每次都会得到一个不同的签名。

于 2011-05-04T13:31:52.567 回答
4

签名不是隐私机制;如果您可以将明文取回,则不认为有问题。如果您的消息必须保密,请加密并签名。

尽管如此,请记住 RSA 签名是使用签名者的私钥创建的。给定这样的签名,您可以使用签名者的公钥“撤消” RSA 转换(将消息的签名提升为e, mod n)并获取作为其输入提供的 SHA1 或其他哈希值。您仍然无法撤消散列函数以获取与已与其消息分离的签名相对应的输入明文。

用于加密的 RSA 是另一回事。此处用于加密的填充方法确实包括随机数据,以阻止流量分析。

于 2011-05-04T12:52:23.840 回答
-2

这就是为什么您在密钥顶部添加盐/初始化向量的原因。这样就不可能分辨出哪些记录来自同一个明文。

于 2011-05-04T12:41:07.543 回答