Перенос кода дешифрования Java в Golang

Я борюсь с миграцией Java-кода на Голанг в течение последних нескольких дней, и теперь я застрял. Это рабочий код 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)

что я знаю до сих пор:

  • все значения ошибок опущен _ are nil в этом фрагменте кода
  • заголовок bzip2 ("BZ") должен быть опущен для CBzip2InputStream, а не bzip2.NewReader
  • первые 16 байт считываются из instream in Java и golang одинаковы, начиная с 17-го байта все байты отличаются по любой причине

2 ответов


CBizp2InputStream действительно использует AES ECB. Это рабочая реализация. Я опустил обработку ошибок, чтобы сделать код короче:

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.Читатель и dst-это io.Writer, оба поставляются в функцию decrypt в качестве аргументов
  • keyString содержит секретный ключ
  • я использую i == 0 как условие разрыва, потому что err можно или нельзя установить значение io.EOF в последнем успешном чтении (см. golang Ио.Спецификация читателя)

отлично работает. Внедрение шифрования теперь должно быть простым.


Я пытаюсь то же самое, но usinh triple DES ECB mode. Я нашел код для ЕЦБ, так как он не реализован в go crypto lib, поскольку он не является безопасным. Однако при инициализации тройного 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 у меня нет этой проблемы.