【问题标题】:Different digital signatures produced by different signing technologies不同签名技术产生的不同数字签名
【发布时间】:2012-01-20 21:40:56
【问题描述】:

我有这样的意见:

  • 摘要 (sha1)。
  • X509 证书,由 makecert 工具制作。所以公钥算法是sha1WithRsa。
  • 证书的私钥,也是由 makecert 工具制作的。

我想用 rsa 签名算法对摘要进行签名。 我使用了以下签名技术:

  • 我自己的签名者(实际上是使用 Microsoft Strong Crypto Provider)
  • 充气城堡
  • Openssl

每个生成和验证签名罚款。但我有 3 个不同的签名作为输出。 我试过很多次。而且这些签名不是随机的。我收到 3 个不变的不同签名。 怎么会这样?有人遇到过这样的问题吗?我有什么不对吗?

更新
Base64 值:

哈希:
XN9ADbe4NVnSscjRGvBnWe1bDaw=

MySigner' 签名:
ARIRJGYMFKL8I8 + FTUBR8AH9SWYBNW2XYFLVTTAXRWZHJ14NRUYL5QSXXAL4 / B0ETKZQH5QIPZB04WX8 + AORNNHXNCLFDDYXMK7AUMILO + 58K4KYYK43QGYUOMPS6MWVMBHPDF0PCU6FRRIMB543PNYQBZGFMALFG + YJJDXBQW4 = P>

BouncyCastle' 签名:
WP1iU2nuooneikMLCaWR9i03B+ISp8+P+C/OqYHNF0qGioIbaRWCPHhxJqhCJdayr6T/X2XPjE2XebITmSmnd4JQgyECK77ju7AxCgBxIAWvzwDFMrrFvQ05wt8KDiDbcnfrRKZK+cmf/SvyBwBdezGuCQjorMXu=

Openssl 的签名:
LRK / KX / + 1VUMHLIKNMZY5H84K2RYU9GTFIP2XXETJJZ96I7TQNG + EU / C9KKRHCBF4KFMT / O8HLLP9NNSRM5VAFNCRPTMOWJMFRRRZXH1BR8SJQMITTSJOY6KNVKMHCRWWEHCFABW8ITHP / 2 + M8NY5C / QL4W7HL8QT5KON3Q5E = P>

更新
带字节的文件 http://download.files.namba.kg/files/5637461

更新
使用 BouncyCastle 签署摘要的代码

        public void SignWithBouncyCastle()
    {
        byte[] digest = File.ReadAllBytes(@"d:\public\signatures\digest");
        byte[] signature = null;
        TextReader textReader = new StreamReader(@"e:\PresentCert\RootCATest2.pem"); // file with private key and public key
        PemReader pemReader = new PemReader(textReader);
        object obj = pemReader.ReadObject();
        AsymmetricCipherKeyPair ackp;
        ackp = (AsymmetricCipherKeyPair)obj;
        RsaDigestSigner signer = new RsaDigestSigner(new Sha1Digest());

        signer.Init(true, ackp.Private);
        signer.BlockUpdate(digest, 0, digest.Length);
        signature = signer.GenerateSignature();

        signer.Init(false, ackp.Public);
        signer.BlockUpdate(digest, 0, digest.Length);
        bool r = signer.VerifySignature(signature);
        // r is true
        File.WriteAllBytes(@"d:\public\signatures\bouncycastle", signature);
    }

然后我使用以下命令通过 openssl 验证签名:

openssl rsautl -verify -inkey e:\PresentCert\pubRootCATest2.pem -pubin -in d:\public\signatures\bouncycastle -out verified

并比较文件

comp verified d:\public\signatures\bouncycastle

它们是不同的。

更新
更正代码

        public void SignMessageWithBouncyCastle()
    {
        //File.WriteAllBytes(@"c:\msg", Encoding.UTF8.GetBytes("the_secret_message"));
        byte[] msg = File.ReadAllBytes(@"c:\msg");
        byte[] signature = null;
        TextReader textReader = new StreamReader(@"e:\PresentCert\RootCATest2.pem"); // file with private key and public key
        PemReader pemReader = new PemReader(textReader);
        object obj = pemReader.ReadObject();
        AsymmetricCipherKeyPair ackp;
        ackp = (AsymmetricCipherKeyPair)obj;
        RsaDigestSigner signer = new RsaDigestSigner(new Sha1Digest());

        signer.Init(true, ackp.Private);
        signer.BlockUpdate(msg, 0, msg.Length);
        signature = signer.GenerateSignature();

        signer.Init(false, ackp.Public);
        signer.BlockUpdate(msg, 0, msg.Length);
        bool r = signer.VerifySignature(signature);
        // r is true
        File.WriteAllBytes(@"c:\bouncycastle", signature);
    }

而我这次使用了这个 openssl 命令:

openssl dgst -sha1 -verify c:\pubRootCATest2.pem -signature c:\bouncycastle c:\msg

结果验证OK!

【问题讨论】:

  • 发布 3 个签名或分析它们,看看它们在哪里/如何不同。
  • 大卫,我附加了带有字节的文件。我分析了签名。它们完全不同。
  • 它可以重复吗?我的意思是,如果您再次运行每种签名技术,结果是否与以前相同?也许日期时间已签名?
  • 我总是在上面附上的摘要上签名。

标签: openssl rsa digital-signature bouncycastle


【解决方案1】:

您正在使用RSA PSS。有效签名不止一个。

【讨论】:

  • 非常感谢!但是.. 我可以用 openssl 验证 BouncyCastle 的签名吗?我试过了,结果无效。
  • 你到底在用什么功能?也许除了其中一个之外,其余都是 RSA PSS。
  • 我检查了 RsaDigestSigner 的代码。看起来它计算输入消息的摘要。所以在我的例子中,哈希被计算了两次。我会更正它并再次测试。
  • 大卫,我设法用 BouncyCastle 签署了消息并用 OpenSSL 验证。如果他们两个都是正确的,那么我的签名者就有错误。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-04-17
  • 2019-04-09
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多