了解BCryptSignHash输出签名

时间:2014-01-08 10:20:42

标签: linux cryptoapi ecdsa cng

我使用 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

1 个答案:

答案 0 :(得分:2)

  

有没有办法了解生成的64字节签名,以便我可以将签名blob内容映射到linux中的(r,s)对并验证它?

rs采用P1363格式,这只是2 {2}恭维格式中rs的串联。也就是说,签名只是r || s

您需要知道哈希才能使用此格式。例如,SHA1将创建一个20个字节的r和一个20个字节的s。如果rs“太短”,则会在左侧用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