2

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

想法?

4

3 回答 3

2

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

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

我还没有使用过 OpenSSL-1.0.0-beta3,所以我不熟悉pkeyutl,但是该dgst命令还会生成和验证数字签名,并且它希望签名是纯朴的、完全未经修饰的二进制文件。

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

于 2009-10-08T04:52:10.403 回答
0

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

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

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

于 2009-10-08T05:15:09.833 回答