Cryptography RSA签名是唯一的吗?

Cryptography RSA签名是唯一的吗?,cryptography,rsa,sign,Cryptography,Rsa,Sign,我想知道RSA签名对于数据是否是唯一的 假设我有一个“hello”字符串。计算RSA签名的方法是首先得到sha1摘要(我知道,这些是数据的unqiue),然后添加一个包含OID和填充方案的头,并进行一些数学抖动来给出签名 现在假设填充相同,openSSL或Bouncy Castle生成的签名是否相同 如果是的话,我唯一担心的是,找回“文本”/“数据”不是很容易吗 实际上,我尝试对一些数据进行RSA签名,而OpenSSL和BC的签名是不同的。我重复了一遍,但每次都得到了相同的签名。我意识到由于填充

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

假设我有一个“hello”字符串。计算RSA签名的方法是首先得到sha1摘要(我知道,这些是数据的unqiue),然后添加一个包含OID和填充方案的头,并进行一些数学抖动来给出签名

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

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


实际上,我尝试对一些数据进行RSA签名,而OpenSSL和BC的签名是不同的。我重复了一遍,但每次都得到了相同的签名。我意识到由于填充的不同,方法的两个签名是不同的。然而,我仍然不确定为什么每次重复时,每个LIB的签名都是相同的。有人能简单地解释一下吗?

这就是为什么你要在你的钥匙上加一个salt/初始化向量。这样就不可能分辨出哪些记录来自同一明文。

签名不是隐私机制;如果你能把明文拿回来,那就不成问题了。如果您的邮件必须保密,那么请加密并签名

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

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

中描述为“旧式v1.5”填充的“常用”填充方案是确定性的。它的工作原理如下:

  • 要签名的数据是散列的(例如,使用SHA-1)
  • 增加固定表头;该头实际上是一个ASN.1结构,用于标识刚刚用于处理数据的哈希函数
  • 添加了填充字节(在左侧):0x00,然后是0x01,然后是一些0xFF字节,然后是0x00。调整0xFF字节数,以使生成的总长度正好是模的字节长度(即1024位RSA密钥的128字节)
  • 填充值被转换为整数(小于模),该整数经过RSA核心的模幂运算。结果被转换回字节序列,这就是签名
所有这些操作都是确定性的,不存在随机性,因此,使用相同的密钥和相同的哈希函数对相同的数据进行签名是正常的,并且预期将永远产生相同的签名

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


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

salt和IVs不用于非对称加密。您的意思是Thomas Pornin在RSA PSS方案中提到的随机salt值吗?sha1摘要不是唯一的。您不能在一个唯一的160位散列中表示所有可能的161位值,更不用说唯一地表示所有可能的消息了。非常感谢您的澄清。出于好奇,如果散列是单向机制,并且特定输入数据的散列是唯一的(虽然Wooble不同意),那么我们不能通过某种映射机制将其与某些输入匹配并检索数据吗?您还可以详细说明使用AES或RSA进行加密的方法。每次相同的文本会给出相同的密文和相同的IV和密钥吗?那么数据是如何隐藏的呢???@user489152:可以将散列映射到它们的源,这样的数据集(称为彩虹表)经常被用来破解密码。然而,这种技术在大多数情况下根本不可行。由于可以提供给散列的数据量是无限的,因此最终将得到一个包含2^128个键(对于SHA-1)的表,每个键实际上都有无限个条目!使用AES——事实上是任何一种理智的对称密码——使用相同的输入和密钥,可以保证获得相同的输出。这就是为什么CBC模式存在的原因,它添加了IVs以使下次的结果看起来不同。如果你使用相同的静脉注射,你会得到相同的结果-但这打破了静脉注射所基于的基本假设,所以不要这样做。非常有洞察力!谢谢你,托马斯。但有一个疑问:“固定标题”是PKCS#1标题本身还是带有填充和固定标题的标题?BC是否也使用PKSC#1标头,还是因为您提到基于ASN.1的标头使用不同的参数而有所不同。或者PKCS#1只是定义了一些头,不同的lib为其提供了不同的参数?@user489152:完全填充为:00 01 FF。。FF 00 30。。04 14 xx。。;“xx..”部分是SHA-1散列。ASN.1标头是从“30”到“04 14”的标头,它具有两个有效版本。第一部分(从'00 01'到'FF 00')在PKCS#1中称为“类型1填充”,并且始终相同(“FF”的数量调整为与密钥大小匹配)。谢谢。