RSA签名是否独一无二?

时间:2011-05-04 12:36:33

标签: cryptography rsa sign

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

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

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

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

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

3 个答案:

答案 0 :(得分:9)

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包含一堆随机字节,因此每次都会得到一个独特的签名。

答案 1 :(得分:3)

签名不是隐私机制;如果您可以将明文退出,那么这不是一个问题。如果您的邮件必须保密,则加密并签名。

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

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

答案 2 :(得分:-1)

这就是您在密钥顶部添加salt / initialisation向量的原因。这样就不可能知道哪些记录来自同一个明文。