我試圖驗證在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返回一個錯誤 –