9

過去数日間、JavaコードのGolangへの移行に苦労していて、今は行き詰まっています。これは動作するJavaコードです。

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、このコードに含まれています
  • bzip2ヘッダー( "BZ")は、の場合は省略できますがCBzip2InputStream、の場合は省略できません。bzip2.NewReader
  • Javaとgolangで読み取られた最初の16バイトinstreamは同じで、17バイト目からは、何らかの理由ですべてのバイトが異なります。
4

2 に答える 2

9

CBizp2InputStreamは確かにAESECBを使用します。これは実用的な実装です。コードを短くするためにエラー処理を省略しました。

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であり、どちらも引数として復号化関数に提供されます
  • keyStringには秘密鍵が含まれています
  • 最後に正常に読み取られたときにio.EOFに設定できる、または設定できないi == 0ため、ブレーク条件として使用します( golang io.Reader仕様を参照) 。err

完璧に動作します。これで、暗号化の実装が簡単になります。

于 2012-10-29T09:12:39.663 に答える
0

私は同じことを試していますが、トリプルDESECBモードを使用しています。安全ではないため、go crypto libに実装されていないため、ECBのコードを見つけました。ただし、トリプルDES暗号を初期化すると、キーの長さでエラーが発生し、特定のキーを使用する必要があります。エラーをスローする暗号ライブラリのコードは次のとおりです。

// NewTripleDESCipher creates and returns a new cipher.Block.
func NewTripleDESCipher(key []byte) (cipher.Block, error) {
if len(key) != 24 {
    return nil, KeySizeError(len(key))
}

この問題を解決するにはどうすればよいですか?Javaではこの問題は発生しないことに注意してください。

于 2018-08-17T05:30:48.837 に答える