2012-10-28 23 views
9

ここ数日間GolangへのJavaコードの移行に苦労しています。これは、作業の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")を省略する必要がありますが、では省略してくださいJavaとgolangにinstreamから読ま3210の
  • 最初の16のバイトは、すべてのバイトが
+2

最初の16バイトが同じで残りが同じでない場合、私は2つの実装が異なるブロック連鎖モードを使用していると思われます:http://en.wikipedia.org/wiki/Block_cipher_modes_of_operationあなたがGolangでCBCを使っているようですが、デフォルトでJavaが手に取られていないかどうかはわかりません。 – Gijs

+0

私はgolangで利用可能なすべての方法を試しました。少なくとも最初の数バイトが正しく復号化されているのはCBCのみでした。おそらく、JavaがECBを使用していない場合は、デフォルトでECBが使用されます。 – fasmat

答えて

9

CBizp2InputStreamが実際にAESのECBを使用して何らかの理由で異なる17バイト目から始まる、同じです。これは実用的な実装です。私はコードを短くするためにエラー処理を省略:

c, _ := aes.NewCipher([]byte(keyString)) 
bufIn := make([]byte, 16) 
bufOut := make([]byte, 16) 
dec := bytes.NewBuffer(make([]byte, 0)) 
var i int 

for { 
    i, _ = src.Read(bufIn) 
    if i == 0 { 
     break 
    } 

    c.Decrypt(bufOut, bufIn) 
    dec.Write(bufOut) 
} 

zip := bzip2.NewReader(dec) 
io.Copy(dst, zip) 

補足説明:

  • srcがio.Readerあるとdstはio.Writerあり、両方の引数
  • として復号化機能に供給されます
  • キー文字列は
  • golang io.Reader specificationを参照してください)私は errがまたは最後に成功した読み取りにio.EOFに設定することができない可能性があるための条件を破るよう i == 0を使用
  • 秘密鍵が含まれています

完全に動作します。暗号化を実装するのが簡単になるはずです。