【发布时间】:2016-04-06 06:42:21
【问题描述】:
我正在尝试验证在 Go 中创建的 Java 签名,反之亦然。但是,在每种情况下,我都没有收到错误,但验证功能是错误的。
使用的公钥和私钥是相同的,参数也是一样,我通过将 Java 密钥数据传递给 Go 并使用它来签名和验证数据来检查这一点 - 这是有效的。
我还检查了传入的数据(然后是 MD5 散列)在 Java 和 Go 中是相同的,并且生成的散列是相同的(以防万一)——它们是。
我知道 Java 使用 ASN1 编码作为它的签名,我找到了一个函数来从 Go 提供的单独的 R 和 S 值重建它,我用它作为模板来拆分由生成的 ASN1 byte[] Java 转换为 Go 的 R 和 S 值。在 Java 中,如果我拆分并重建 ASN1 byte[],我可以验证签名,但无论我做什么,Go 都不会,Java 也不会验证 Go 签名的签名。
他们使用的 DSA 算法版本有区别吗?我看到 Java 使用 SHA1withDSA 并提到它符合 FIPS 186-3 规范
【问题讨论】: