2014-01-08 69 views
1

我已经在窗口中使用BCryptSignHash与ECDSA算法签署了哈希值。输出签名缓冲区的长度为64个字节。我还使用BCryptGenerateKeyPair函数(BCRYPT_ECDSA_P256_ALGORITHM算法)生成了公钥和私钥blob,并使用该函数对散列进行了签名。了解BCryptSignHash输出签名

我必须在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内容映射到(r,s)对在Linux中并验证它?

还是有更简单的方法来验证在linux生成的签名?

谢谢, ˚F

回答

2

有一种方法来了解产生,这样我可以在Linux映射签名团块内容(R,S)对并验证它在64字节的签名?

rs在P1363格式,它是简单的和rs作为2的补码格式的级联。也就是说,签名只是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

+0

感谢您的信息..我试过crypto ++,并且我能够在Windows和Linux应用程序级别使用签名和密钥。 但现在我得到了另一个问题来处理... | 正在Windows应用程序级别完成签名。验证必须在2个地方完成 - linux应用程序和Windows驱动程序。 Crypto ++在Windows应用程序级别创建密钥时非常有用,并且我在数据上签名。使用相同的密钥,我能够在Linux应用程序中验证数据。现在我遇到的问题是我不能在Windows驱动程序中使用crypto ++。 是否有3种格式的公共图书馆? – Fazlin