2016-10-30 1 views
5

:ゴーから異なる結果移動中にファイルを復号化し、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バイト大きいです。 OpenSSLので生成されたファイルから、hexdumpに対しての

テール:囲碁プログラムによって生成されたファイルから、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       |........| 

テール:

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は囲碁プログラムからの出力をファイルに追加されますか?

EDIT:BJブラックが説明するように、私の囲碁プログラムからの出力で余分なバイトの理由は、PKCSパディングが

です。

ファイルはCBCモードのAESで暗号化されているため、プレーンテキスト入力はブロックサイズの倍数になります。この要件を満たすためにパディングが追加されます。 AESのブロックサイズは16バイトなので、パディングバイトの合計数は常に1〜16バイトです。各パディングバイトは、私のケースでは0x08のパディングバイトの総数に等しい値を持っています。

paddingBytes := int(data[len(data)-1]) 

WriteFile関数は、その後変更することができます。

ので、パディングの量を調べるために1だけでintに復号化されたファイルの最後のバイトを読み、その数を変換する必要があり、ファイルに追加

err = ioutil.WriteFile("file.decrypted", data[:len(data)-paddingBytes], 0644) 

私のGoプログラムからの出力は、OpenSSLの出力と同じです。

+0

John Smithさん、こんにちは、スタックオーバーフローへようこそ。寄付いただきありがとうございます。あなた自身の質問に対する回答がある場合、または質問に対する回答を拡大したい場合は、下記の回答セクションで回答してください。これにより、他のユーザーは、テキストを解析してどのテキストを見ているのかわからずに、質問と回答の間をより簡単にナビゲートできます。 –

答えて

3

あなたが見ているのは、OSSLがあなたのために削除していて、GoがデフォルトではないPKCSパディングです。関連するReddit投稿hereを参照してください。

基本的に、この例に従えばいいですね。

関連する問題