RSA签名是否独一无二?

use*_*152 4 cryptography rsa sign

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

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

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

如果是的话,我唯一担心的是,获取"文本"/数据会不容易?

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

Tho*_*nin 10

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