【问题标题】:What format signature does Openssl pkeyutl expect?Openssl pkeyutl 期望什么格式签名?
【发布时间】:2009-10-08 04:30:46
【问题描述】:

我正在尝试验证通过使用 SHA-1 散列并使用 RSA 私钥加密散列来签名的文件。

显然我正在使用 RSA 公钥进行验证。密钥为 DER 格式。

签名验证使用 Java 的 Signature 类可以正常工作。

我正在尝试的 openssl 命令(和结果)是:

       ~/Downloads/openssl-1.0.0-beta3/apps/openssl pkeyutl -in encryptedZip.bin 
-keyform DER -verify -sigfile savedDigitalSignature.txt -pubin -inkey public.der
    WARNING: can't open config file: /usr/local/ssl/openssl.cnf
    Signature Verification Failure

我在 openssl 配置文件中看不到任何适用的内容,因此我认为该警告并不重要。

savedDigitalSignature.txt 文件包含签名字节。

我的理论是,openssl 正在寻找某种特定文件格式的数字签名,但我在文档中没有找到任何说明应该是什么的内容。

想法?

【问题讨论】:

  • 您的声明“...是通过使用 SHA-1 散列签名并使用 RSA 加密散列...”听起来很可疑,因为加密和签名不是同一个操作。但是由于您的 java 库接受签名我想知道您使用的是哪个 java 库?
  • 我向那些回答的人道歉(并感谢)。我正在做的是使用 Java Signature 类进行签名。我以为它是通过对数据进行哈希处理,然后对哈希进行加密来做到这一点的,但现在我发现这个假设是不正确的。
  • @Accipitridae:数字签名是用私钥加密的消息摘要。加密与签名不同,但它是其中的一部分。

标签: encryption openssl rsa digital-signature


【解决方案1】:

此命令级别非常低。您必须确保一切都采用正确的格式才能正常工作,

  1. 输入签名(-sigfile)必须是二进制签名。对于 RSA,填充必须是 PKCS#1。
  2. 输入数据必须是二进制摘要。如果你用 SHA1 签名,这个文件只能包含 20 个字节。
  3. 公钥必须采用 X.509 编码的 SubjectPublicKeyInfo DER 或 PEM 格式。

【讨论】:

  • 对于 RSA pkeyutl(以及 dgst -sign/-verify)默认为 PKCS1(v1.5) 但支持其他填充;请参阅标题“RSA 算法”下的手册页。尽管 Java JCE 不支持它们中的大多数,但这显然是这里的签名者。
【解决方案2】:

我还没有使用过OpenSSL-1.0.0-beta3,所以我对pkeyutl不熟悉,但是dgst命令也会生成和验证数字签名,它希望签名是普通的,完全朴素的二进制。

例如,对于 RSA 签名,它需要一个表示单个 BigNum 的二进制 blob。查看 pkeyutl 的 maual 页面,似乎它的工作方式相同。一个简单的测试是使用 pkeyutl 对某些内容进行签名,并检查输出(如果位大小与您的 RSA 密钥长度相同,则它是一个普通的 BigNum - 如果它更大,请尝试使用 dumpasn1 来查看它是否是 DER 格式)。

【讨论】:

    【解决方案3】:

    Java 期望 RSA 签名遵循 PKCS #1:摘要算法和摘要的序列,然后签名(使用 RSA 私钥加密)。

    pkeyutl 可能只需要摘要,而不是 ASN.1 结构,但这会令人惊讶地忽视互操作性。在任何一种情况下,一旦数据被“签名”,“签名”输出将看起来相似……只是一个随机的八位字节串。

    请发布pkeyutl 生成的示例签名,以及验证它的公钥和要验证的文件。

    【讨论】:

    • -1:用私钥签名和加密不是一回事。
    • PKCS #1 说,“对于数字签名,要签名的内容首先通过消息摘要算法(例如 MD5)简化为消息摘要,然后是包含 消息摘要使用内容签名者的 RSA 私钥加密。” RSA 加密和 RSA 签名的区别在于加密前数据前面的块类型。
    • 很抱歉在这里迂腐。但是混合加密和签名是造成混乱和严重错误的常见原因。这也可能是导致 OPs 问题的原因。您引用的文本 sn-p 似乎来自 1993 年版本的 PKCS#1 标准。 RSA 实验室早就注意到了他们的错误,并且新版本的标准都不再包含这种不幸的表述。
    • 事实上,他们做到了。虽然 2.1 版确实为签名表示了单独的加密原语 (RSASP1/RSAVP1),但在描述它们时,它指出,“每个原语中的主要数学运算是求幂,就像在第 5.1 节的加密和解密原语中一样。RSASP1 和 RSAVP1除了输入和输出参数的名称外,它们与 RSADP 和 RSAEP 相同;它们的区别在于它们用于不同的目的。”然后他们继续复制上一节关于 RSADP 和 RSAEP 的公式。
    • 请仔细阅读标准。不要再声称签署消息涉及加密。无论如何,这不是重点。主要观察结果是,有些人实际上使用了他们认为等同于签名的加密,因此可能导致不安全的实施。因此,重要的是不要将签名描述为使用私钥进行加密。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2020-12-02
    相关资源
    最近更新 更多