2016-04-05 34 views
1

我试图验证在Go中创建的Java中的签名,反之亦然。但是,在每种情况下,我都没有收到错误,但在验证功能上是错误的。无法验证在Go中创建的Java中的DSA签名,反之亦然

正在使用的公钥和私钥与参数一样,我已经通过将Java密钥数据传递给Go来检查该数据,并使用它来签署和验证数据 - 这是有效的。

我也检查过被传入的数据(然后是MD5哈希)在Java和Go中都是相同的,并且生成的哈希值相同(以防万一) - 它们是。

我知道Java为它的签名使用了ASN1编码,并且我找到了一个函数来从Go提供的单独的R和S值重建这个函数,并且我使用它作为模板来分割生成的ASN1字节[]通过Java将其转换为Go的R和S值。在Java中,如果我拆分并重建ASN1字节[],我可以验证签名,但无论我做什么,Go都不会,并且Java不会验证由Go签名的签名。

他们使用的DSA算法的版本是否有区别?我看到Java使用SHA1withDSA,并提及它符合FIPS 186-3规范

回答

0

您不应该手动分割ASN1 []字节,您应该使用crypto pkg中的函数。

https://golang.org/pkg/crypto/x509/#Certificate.CheckSignature看起来像它需要一个SignatureAlgorithm作为参数(并且DSAWithSHA1是一个有效值)。

+0

不幸的是Go不支持解析DSA密钥以这种方式,即使支票签名方法允许DSA,我切换到RSA,发现即使检查去计算签名时CheckSignature返回一个错误 –

相关问题