1

我已经使用带有 ECDSA 算法的BCryptSignHash在 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

4

1 回答 1

2

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

rands是 P1363 格式,它只是 2 的补码格式的串联rs。也就是说,签名很简单r || s

您需要知道哈希才能使用这种格式。例如,SHA1 将创建一个r20 字节和一个s20 字节。如果rors是“太短”,则在左侧用 0 填充。

Java 和 OpenPGP 与 P1363 不同。Java 和 OpenPGP 使用 ASN.1 编码:

SEQUENCE ::= {
  r INTEGER,
  s INTEGER
}

根据您在 Linux 上使用的库,您可能需要在格式之间进行转换。Cryptographic Interoperability: Digital Signatures给出了使用几个不同库进行签名和验证的示例。


或者有没有更简单的方法来验证linux中生成的签名?

尝试加密++。我相信微软和 Crypto++ 使用相同的签名格式,所以你不需要转换。有关详细信息,请参阅椭圆曲线数字签名算法

于 2014-01-10T15:24:30.317 回答