Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Openssl 不同签名技术产生的不同数字签名_Openssl_Rsa_Digital Signature_Bouncycastle - Fatal编程技术网

Openssl 不同签名技术产生的不同数字签名

Openssl 不同签名技术产生的不同数字签名,openssl,rsa,digital-signature,bouncycastle,Openssl,Rsa,Digital Signature,Bouncycastle,我有这样的意见: 文摘(sha1) X509证书,由makecert工具制作。所以公钥算法是用RSA实现的 证书的私钥,也由makecert工具生成 我想用rsa签名算法对摘要签名。 我使用了以下签名技术: 我自己的签名者(实际使用Microsoft强加密提供程序) 弹跳船舱 Openssl 每一个都可以生成并验证签名。但我有3个不同的签名作为输出。 我试过很多次了。这些签名不是随机的。我收到3个不同的签名。 怎么可能呢?有人有这样的问题吗?我做错什么了吗 更新 Base64值: 散列:

我有这样的意见:

  • 文摘(sha1)
  • X509证书,由makecert工具制作。所以公钥算法是用RSA实现的
  • 证书的私钥,也由makecert工具生成
我想用rsa签名算法对摘要签名。 我使用了以下签名技术:

  • 我自己的签名者(实际使用Microsoft强加密提供程序)
  • 弹跳船舱
  • Openssl
每一个都可以生成并验证签名。但我有3个不同的签名作为输出。 我试过很多次了。这些签名不是随机的。我收到3个不同的签名。 怎么可能呢?有人有这样的问题吗?我做错什么了吗

更新
Base64值:

散列:
XN9ADBE4NVNSSCJRGVBNW1BDAW=

我的签名人的签名:
aRiRJgYmFKl8i8+FTUBR8AH9SWYBNW2xYFLVTAXRWZHJ14NRUYL5QSXXAL4/B0etKZQH5qipZB04wx8+AORNNHXNCLFDYXMK7AUMILO+58K4KYYK43QGYOUMP6MWVMBHPDF0PCU6FRRIMB543PNYQBZGFMALFG+Yjjdxbqw4=

BouncyCastle的签名:
WP1U2NUOONEIKmlCAWR9I03B+ISp8+P+C/OQYHNF0QGIOIBARWCPHHHHXJQHCJDAYR6T/X2XPJE2XEBITSMND4JQGYECK77JU7JU7AXCGBXIAWZWDFMRRFVQ05WT8KDIDBCNRRKZK+cmf/Svybedezgucq3MXU7JOO5L9LXQRM4=

Openssl的签名:
lRk/kX/+1vUmHLIKNmZy5h84K2ryu9GtfIp2XXeTsJJz96i7tqNg+EU/C9KKKKRHCBF4KFMT/O8HLP9NNSRM5VAFNCrPTMOWJMFRRZXH1BR8SJQMITTSJY6KNVKMHCRWWEHCFABW8ITHP/2+m8NY5C/QL4W7hL8qt5KoN3q5E=

更新
包含字节的文件

更新
使用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

结果被证实是正确的

您正在使用。有多个有效的签名。

发布这3个签名或分析它们,看看它们的区别在哪里/如何。David,我附上了带有字节的文件。我分析了签名。它们完全不同。它可以重复吗?我的意思是,如果您再次运行每种签名技术,结果是否与以前相同?也许datetime已经签名了?我总是在上面的摘要上签名。非常感谢!但是我可以用openssl验证BouncyCastle的签名吗?我试过了,结果无效。你到底在用什么函数?也许除了一个以外,其他都是RSA PSS。我检查了签名者的代码。看起来它会计算输入消息的摘要。在我的例子中,散列计算了两次。David,我用BouncyCastle对消息进行了签名,并用OpenSSL进行了验证。如果他们两个是正确的,那么我的签名人就错了。谢谢