5
我已經寫以下代碼來解密文件時:不同的結果解密在Go和OpenSSL文件
openssl aes-128-cbc -d -in file.encrypted -out file.decrypted -iv $IV -K $KEY
輸出文件從轉到:
data, err := ioutil.ReadFile("file.encrypted")
if err != nil {
log.Fatal(err)
}
block, err := aes.NewCipher(key)
if err != nil {
log.Fatal(err)
}
mode := cipher.NewCBCDecrypter(block, iv)
mode.CryptBlocks(data, data)
err = ioutil.WriteFile("file.decrypted", data, 0644)
if err != nil {
log.Fatal(err)
}
我也使用OpenSSL解密的文件程序比來自OpenSSL的輸出文件大8個字節。從文件的圍棋程序產生的hexdump都的
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
ff ff ff ff ff ff ff ff |........|
尾:
由OpenSSL的生成的文件hexdump都尾
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
ff ff ff ff ff ff ff ff 08 08 08 08 08 08 08 08 |................|
爲什麼08 08 08 08 08 08 08 08
附加在從圍棋程序文件輸出?
編輯:
由於BJ黑色解釋說,從我的圍棋程序的輸出額外的字節的原因是PKCS填充。
該文件在CBC模式下使用AES進行加密,因此純文本輸入應爲塊大小的倍數,添加填充以滿足此要求。 AES的塊大小爲16字節,因此填充字節的總數將始終在1到16個字節之間。每個填充字節的值等於填充字節的總數,在我的情況下是0x08
。
因此,找出填充量添加到該文件,一個只需要閱讀解密文件的最後一個字節,並轉換這一數字爲int:
paddingBytes := int(data[len(data)-1])
WriteFile函數然後可以修改像這樣:
err = ioutil.WriteFile("file.decrypted", data[:len(data)-paddingBytes], 0644)
現在我的Go程序的輸出與OpenSSL的輸出相同。
嗨,John Smith,歡迎來到Stack Overflow。感謝您的貢獻。如果您對自己的問題有答案,或希望擴大對問題的答案,請在下面的答案部分中填寫答案。這允許其他用戶在問題和答案之間更輕鬆地導航,而不必解析文本以找出他們正在查看哪一個。 –