cryptography - RSA 签名是唯一的吗?

标签 cryptography rsa sign

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

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

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

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

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

最佳答案

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

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

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

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

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

    关于cryptography - RSA 签名是唯一的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5883451/

    相关文章:

    r - 如何在 R 中从右向左/向后移动减号?

    javascript - 如何在 JavaScript 中创建 aes-256 加密

    c - Openssl crypto lib中有一个函数可以安全地输入密码吗?

    php - xmlseclibs 无法签署我想要的节点

    c - PKSC1V2.2 RSASSA-PSS 签名方案的测试 vector

    C# 如果我有私钥我该如何解密?

    r - 如何随机更改向量中数字的符号?

    java - 无法将 SHA256 与来自 Java on .Net c# 的 RSA 签名进行匹配

    vb.net 大于十进制的数据类型

    linux - ssh-keygen - 如何使用特定用户名设置 rsa key