Длина вектора инициализации Oracle DBMS_CRYPTO.ENCRYPT для AES256 - PullRequest
2 голосов
/ 23 ноября 2011

Существует ли минимальная / максимальная длина для вектора инициализации при использовании процедуры DBMS_CRYPTO.ENCRYPT?Я получаю ошибку ниже:

ORA-28817: PL/SQL function returned an error.
ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 3
ORA-06512: at "SYS.DBMS_CRYPTO", line 13
ORA-06512: at "Test_Encryption", line 14
ORA-06512: at line 3

Код, генерирующий эту ошибку, выглядит следующим образом:

raw_encrypted_token := DBMS_CRYPTO.ENCRYPT( src => UTL_I18N.STRING_TO_RAW( input_token, 'AL32UTF8' ),
                                            typ => encryption_type,
                                            key => key_raw_form,
                                            iv => hextoraw('0123456789ABCDEF') );

Когда я меняю ключ с 16 на 32 байта, у меня нет проблем.Однако я экспериментирую с декодированием в Java с использованием объекта Cipher, и вектор инициализации может иметь длину всего 16 байтов.Любые предложения о том, как я могу решить проблему вектора инициализации в pl / sql?

1 Ответ

3 голосов
/ 24 ноября 2011

Для большинства режимов работы блочного шифра вектор инициализации должен иметь ту же длину, что и размер блока. Для AES это 128 бит = 16 байт.

Ваш код

hextoraw('0123456789ABCDEF')

фактически выдает 16 · 4 = 64-битное значение, поскольку каждая шестнадцатеричная цифра соответствует 4 битам, а не 8-битному байту. Поэтому строка из 16 шестнадцатеричных цифр - это правильная длина для 128-битного вектора инициализации.

С другой стороны, вам не следует использовать жестко закодированный вектор инициализации, если вы используете один и тот же ключ для каждой записи. В целях безопасности каждая запись должна быть зашифрована своим собственным вектором инициализации - предпочтительно случайным, хотя в зависимости от режима работы (например, CTR) может быть достаточно уникальной (если вы оставляете некоторое пространство между последовательными).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...