我使用 BCryptSignHash 和ECDSA算法在Windows中签署了一个哈希值。输出签名缓冲区长度为64个字节。我还使用 BCryptGenerateKeyPair 函数(BCRYPT_ECDSA_P256_ALGORITHM算法)生成了公钥和私钥blob,我使用该函数对哈希进行了签名。
我必须在linux中用这个密钥对来验证这个签名。我能够使用链接“http://msdn.microsoft.com/en-us/library/windows/desktop/aa375520%28v=vs.85%29.aspx”解密生成的公钥 - 私钥对,并且能够在linux中使用它。
生成的64字节签名理想情况下应为签名对(r,s)(http://en.wikipedia.org/wiki/Elliptic_Curve_DSA)。
有没有办法了解生成的64字节签名,以便我可以将签名blob内容映射到linux中的(r,s)对并验证它?
或者有更简单的方法来验证linux中生成的签名吗?
谢谢, ˚F
答案 0 :(得分:2)
有没有办法了解生成的64字节签名,以便我可以将签名blob内容映射到linux中的(r,s)对并验证它?
r
和s
采用P1363格式,这只是2 {2}恭维格式中r
和s
的串联。也就是说,签名只是r || s
。
您需要知道哈希才能使用此格式。例如,SHA1将创建一个20个字节的r
和一个20个字节的s
。如果r
或s
“太短”,则会在左侧用0填充。
Java和OpenPGP与P1363不同。 Java和OpenPGP使用ASN.1编码:
SEQUENCE ::= {
r INTEGER,
s INTEGER
}
根据您在Linux上使用的库,您可能需要在格式之间进行转换。 Cryptographic Interoperability: Digital Signatures提供了使用几个不同库进行签名和验证的示例。
或者有更简单的方法来验证linux中生成的签名吗?
试试Crypto++。我相信Microsoft和Crypto ++使用相同的签名格式,因此您不需要转换。有关详细信息,请参阅Elliptic Curve Digital Signature Algorithm。