2016-10-30 55 views
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的輸出相同。

+0

嗨,John Smith,歡迎來到Stack Overflow。感謝您的貢獻。如果您對自己的問題有答案,或希望擴大對問題的答案,請在下面的答案部分中填寫答案。這允許其他用戶在問題和答案之間更輕鬆地導航,而不必解析文本以找出他們正在查看哪一個。 –

回答

3

你看到的是PKCS填充,OSSL正在爲你移除,Go不是默認值。請參閱相關的Reddit帖子here

基本上,按照例子,你很好去。

相關問題