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工具生成
- 我自己的签名者(实际使用Microsoft强加密提供程序)
- 弹跳船舱
- Openssl
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进行了验证。如果他们两个是正确的,那么我的签名人就错了。谢谢