我试图验证在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规范
不幸的是Go不支持解析DSA密钥以这种方式,即使支票签名方法允许DSA,我切换到RSA,发现即使检查去计算签名时CheckSignature返回一个错误 –