Encryption Openssl pkeyutl期望什么格式的签名?

Encryption Openssl pkeyutl期望什么格式的签名?,encryption,openssl,rsa,digital-signature,Encryption,Openssl,Rsa,Digital Signature,我正在尝试验证一个文件,该文件是通过使用SHA-1散列并使用RSA私钥加密散列而签名的 显然,我正在使用RSA公钥进行验证。密钥是DER格式的 使用Java的签名类,签名验证可以正常工作 我正在尝试的openssl命令(结果是): 我在openssl配置文件中没有看到任何适用的内容,因此我认为该警告并不重要 savedDigitalSignature.txt文件包含签名字节 我的理论是,openssl正在寻找某种特定文件格式的数字签名,但我在文档中没有找到任何说明应该是什么格式的内容 想法?我还

我正在尝试验证一个文件,该文件是通过使用SHA-1散列并使用RSA私钥加密散列而签名的

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

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

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

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

savedDigitalSignature.txt文件包含签名字节

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


想法?

我还没有使用OpenSSL-1.0.0-beta3,所以我不熟悉
pkeyutl
,但是
dgst
命令也会生成和验证数字签名,它希望签名是纯二进制的,完全不加修饰的


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

Java希望RSA签名跟随PKCS#1:一个摘要算法和摘要的序列,然后签名(使用RSA私钥加密)

这可能是因为
pkeyutl
只期望摘要,而不是ASN.1结构,但这将是对互操作性的一种令人惊讶的忽视。在任何一种情况下,一旦数据被“签名”,则“签名”输出将看起来类似……只是一个随机的八进制字符串


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

此命令级别非常低。您必须确保所有内容的格式都正确,才能正常工作

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

  • 您的声明“…是通过SHA-1哈希和RSA加密哈希签名的…”听起来很可疑,因为加密和签名不是同一个操作。但是由于您的java库接受签名,我想知道您使用的是哪个java库?我表示歉意(和感谢)对于那些回答的人,我正在使用java签名类来签名。我假设它是通过散列数据然后加密哈希来实现的,但是我现在看到这个假设是错误的。@ AccTitri网:数字签名是用私钥加密的消息摘要。加密与签名不一样,但它是PAR。t of it.-1:签名和使用私钥加密不是一回事。PKCS#1说,“对于数字签名,首先使用消息摘要算法(如MD5)将要签名的内容缩减为消息摘要,然后使用内容签名者的RSA私钥对包含消息摘要的八位字节字符串进行加密。”RSA加密和RSA签名之间的区别在于加密前数据的前缀为块类型。很抱歉在这里过于迂腐。但混合使用加密和签名是造成混淆和严重错误的常见原因。这也可能是OPs问题的原因。您引用的文本片段似乎来自1993年版本的PKCS#1标准。RSA实验室很久以前就注意到了他们的错误,并且该标准的新版本中没有一个包含这种不幸的公式。事实上,他们已经注意到了。虽然版本2.1确实表示签名的单独加密原语(RSASP1/RSAVP1),但在描述它们时,它指出,“与第5.1节中的加密和解密原语一样,每个原语中的主要数学运算是求幂运算。RSASP1和RSAVP1与RSADP和RSAEP相同,只是它们的输入和输出参数的名称不同;它们的区别在于它们的用途不同。"然后,他们继续复制上一节关于RSADP和RSAEP的公式。请仔细阅读该标准。不要再声称对消息进行签名涉及加密。无论如何,这不是重点。主要的观察结果是,有些人实际上使用了加密,他们认为这相当于签名,因此RSADP可能会导致不安全的实现。因此,重要的是不要将签名描述为使用私钥的加密。对于RSA
    pkeyutl
    (和
    dgst-sign/-verify
    )也默认为PKCS1(v1.5)但支持其他填充;请参阅标题为“RSA算法”下的手册页。尽管大多数填充都不受Java JCE支持,但Java JCE显然是这里的签名者。
           ~/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