9
過去幾天我一直在努力將Java代碼遷移到Golang,現在我陷入困境。這是工作的Java代碼:將Java解密代碼遷移到Golang
final Key k = new SecretKeySpec(keyString.getBytes(), "AES");
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.DECRYPT_MODE, k);
final InputStream in = new BufferedInputStream(new FileInputStream(fileNameToDecrypt));
final CipherInputStream instream = new CipherInputStream(in, c);
if (instream.read() != 'B') {
System.out.println("Error");
}
if (instream.read() != 'Z') {
System.out.println("Error");
}
final CBZip2InputStream zip = new CBZip2InputStream(instream);
在Golang我的實現:
c, _ := aes.NewCipher([]byte(keyString))
// IV must be defined in golang
iv := []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
d := cipher.NewCBCDecrypter(c, iv)
fi, _ := os.Open(fileNameToDecrypt)
stat, _ := fi.Stat()
enc := make([]byte, stat.Size())
dec := make([]byte, stat.Size())
fi.Read(enc)
d.CryptBlocks(dec, enc)
instream := bytes.NewBuffer(dec)
zip := bzip2.NewReader(instream)
我知道什麼至今:
- 通過
_
忽略所有的錯誤值nil
在這片代碼 - 對於
CBzip2InputStream
,必須省略bzip2標題(「BZ」),但不適用於bzip2.NewReader
- 在Java和golang從
instream
讀前16個字節是相同的,從第17個字節的所有字節無論出於何種原因
如果前16個字節相同,其餘不相同,我懷疑這兩個實現使用不同的塊鏈接模式:http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation。看來你在Golang中使用CBC,不知道Java中的默認值是什麼。 – Gijs
我嘗試了所有golang中可用的方法。 CBC是唯一至少前幾個字節被正確解密的。也許Java在默認情況下使用ECB,如果沒有IV,我會檢查一下,謝謝你的提示。 – fasmat