aes.NewCipher возвращает допустимый блок, но я получаю ошибку при вызове block.BlockSize () - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь заставить AES-шифрование и дешифрование работать в своем API-интерфейсе go, я создаю новый блок с помощью aes.NewCipher (mykey), и блок кажется действительным, но затем, когда я вызываю cipher.NewCBCDecrypter (block,iv) функция вызывает ошибку «недопустимый адрес памяти или разыменование нулевого указателя» в строке 26 в cbc.go, когда она пытается вызвать b.BlockSize ().

Так что я попытался вызвать block.BlockSize () измой собственный код, и я также получаю исключение, но когда я проверяю блок var, он не равен nil.

func Decrypt(data []byte) (result []byte, err error) {
    logger := logrus.New()

    logger.Infof("Starting decryption for string: %s\n", string(data[:]))

    var block cipher.Block

    if block, err := aes.NewCipher([]byte(app.Config.AESKey)); (err != nil) || (block == nil) {
        logger.Infof("Failed to create block\n")
        return nil, err
    }

    if len(data) < aes.BlockSize {
        logger.Infof("Input too short\n")
        return nil, nil
    }

    cbc := cipher.NewCBCDecrypter(block, []byte(app.Config.AESIV))
    cbc.CryptBlocks(data, data)

    return data, nil
}

Я ожидаю, что функция будет работать должным образом, поскольку aes.NewCipher не возвращает ошибку.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Я вижу свою проблему сейчас, я не очень знаком с go, поэтому я в основном создавал 2 блочные переменные, одна из которых была доступна для всей функции, а одна - только доступная форма внутри оператора if.

0 голосов
/ 02 февраля 2019

Удалить эту строку

var block cipher.Block

Когда вы инициализируете блок в следующей строке.

По сути, вы создаете 2 переменные блока.

...