Я конвертирую некоторый код Python в Go и попал в ловушку.
Код Python выглядит следующим образом:
counter = Counter.new(64, prefix=nonce, initial_value=0)
decryptor = AES.new(key, AES.MODE_CTR, counter=counter)
decryptor.decrypt(ciphertext)
Моя попытка конвертировать что Go должен был использовать:
block, _ := aes.NewCipher(key)
stream := cipher.NewCTR(block, nonce)
stream.XORKeyStream(ciphertext, ciphertext)
Однако эти два метода, похоже, не дают один и тот же дешифрованный открытый текст. Я не могу найти информацию о том, как установить пользовательские префиксы и счетчики в Go. Этого можно добиться с помощью стандартной библиотеки Go или мне придется «свернуть свое собственное крипто».
Более того, я не думаю, что второй параметр NewCTR
предназначен для одноразового использования и Я получаю сообщение об ошибке: IV length must equal block size
. Нужно ли мне также устанавливать нестандартный размер блока? Возможно ли это?
Еще один метод, который я пытался использовать GCM:
block, _ := aes.NewCipher(key)
stream, _ := cipher.NewGCMWithNonceSize(block, 8)
stream.Open(ciphertext[:0], nonce, ciphertext, nil)
Но этот метод каждый раз давал пустой результат. время.