Какую длину я должен указать для строки, зашифрованной с помощью AES-256-CB C в базе данных? - PullRequest
1 голос
/ 15 апреля 2020

Я использую метод AES 256 cb c для шифрования моих файлов. Столбец, который я шифрую, называется «Имя». Ранее перед шифрованием я установил длину varchar в phpmyadmin для «Name» равной 20. Когда я пытался зашифровать, я увидел, что она короткая и вся зашифрованная строка не вставляется в базу данных. Поэтому я изменил размер varchar на 50, но длина все еще мала. Я должен сделать это и для другой колонки. Как определить эффективную длину для столбца «Имя».

Я использую рандомизированный IV в шифровании, как видно из приведенного ниже примера.

$encryptionMethod = "AES-256-CBC";
$secretHash = "25c6c7ff35b9979b151f2136cd13b0ff";
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($encryptionMethod));

//To encrypt
$encrypted = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash,false,$iv);

$encryptedMessage =    $encrypted . ':' .base64_encode($iv);

во время расшифровки я использую

$parts = explode(':', $encryptedMessage);
// Decrypt the data
$decryptedMessage = openssl_decrypt($parts[0], $encryptionMethod, $secretHash, 0, base64_decode($parts[1]));

echo $decryptedMessage;

, так как IV добавляется в зашифрованную строку, как я смогу рассчитать длину, которая должна быть определена в базе данных для столбца «Имя».

1 Ответ

1 голос
/ 15 апреля 2020

Размер блока AES составляет 16 байт, поэтому вам потребуется

  • размер вашего ввода, округленный до ближайшего кратного 16
  • плюс, если входное значение уже кратно 16, один размер блока для заполнения PKCS # 5
  • плюс 16 байтов для IV

Обратите внимание, что это не обязательно относится к другому шифру mode 1 .

Таким образом, для ввода 20 байтов вам потребуется всего 48 байтов. Однако , вы также base64 кодируете результат, который требует как минимум 33% больше места (т.е. вы должны хранить необработанные байты, если вам нужно пространство).

Вы должны всегда объединять перед кодированием, в противном случае вы часто тратите пространство с несколькими последовательностями байтов заполнения. Если ваш ввод имеет длину 20 байтов, кодирование 32-байтового зашифрованного текста само по себе дает 44 байта, а кодирование IV - 24 байта (оба требуют заполнения). Конкатенация перед кодированием дает только 64 байта.

Конкатенация перед кодированием также не требует разделителя, поскольку длина IV известна.


1 Шифры AEAD, такие как GCM, обычно предпочтительнее, чем CB C, но требуют больше места для хранения аутентификации ha sh, очевидно.

...