无法验证在 Go 中创建的 Java 中的 DSA 签名,反之亦然



我正在尝试验证在Go中创建的Java签名,反之亦然。然而,在每种情况下,我都没有得到任何错误,但在验证函数上是错误的。

所使用的公钥和私钥以及参数都是相同的,我通过将Java密钥数据传递给Go并使用它对数据进行签名和验证来检查这一点——这很有效。

我还检查了传入的数据(然后进行MD5哈希处理)在Java和Go中是否相同,并且生成的哈希是否相同(以防万一)——它们是相同的。

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

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

您不应该手动处理ASN1[]字节的拆分,您应该使用加密软件包中的函数。

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

好的,DSA可能不同,但至少对RSA来说,解决方案是Java不希望首先对值进行散列(我想它在内部进行散列),而GO则希望,将函数更改为使用RSA而不是DSA,并考虑到以上情况,这起到了作用。

验证rsa。SignPKCS1v15签名在Java 中的golang中生成

最新更新