2016-04-05 63 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返回一個錯誤 –

相關問題