Openssl pkeyutl期望什么格式签名?

时间:2009-10-08 04:30:46

标签: encryption openssl rsa digital-signature

我正在尝试验证使用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正在寻找具有某种特定文件格式的数字签名,但我没有在文档中找到任何指示应该是什么的内容。

思想?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我还没有使用OpenSSL-1.0.0-beta3,所以我不熟悉pkeyutl,但dgst命令也会生成并验证数字签名,并且它希望签名到是简单的,完全朴素的二进制文件。

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

答案 2 :(得分:0)

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

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

请发布由pkeyutl生成的示例签名,以及将对其进行验证的公钥以及要验证的文件。