уменьшить результаты openssl_encrypt

class Cryptography {
public function encrypt($string) {
$ivlen = openssl_cipher_iv_length($cipher='AES-128-CBC');
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($string, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
return base64_encode($iv.$hmac.$ciphertext_raw);
}
public function decrypt($encryptedString) {
$c = $encryptedString;
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$decryptedString = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac)) {
return $decryptedString;
}
}
}

это только один из результатов шифрования.

3cV/FVGk/gpIofUs5GL3DTid8FOZTXPivxat7+SZG+ARqPWiRUMazeq2cOJpCjzmVzN8arFcl7VDSC6nFvh1CA==

как я могу уменьшить его примерно наполовину, но шифрование и дешифрование все еще работает.

-2

Решение

Есть несколько способов уменьшить размер зашифрованного текста:

  1. уменьшить количество открытого текста (например, более плотный формат или сжатие);
  2. уменьшите размер IV или вычислите IV по известному уникальному номеру вместо того, чтобы включать его в зашифрованный текст;
  3. использовать режим работы, который не требует заполнения (OpenSSL / CBC использует заполнение PKCS # 7 по умолчанию);
  4. уменьшите размер тега аутентификации (значение HMAC), взяв самые левые байты;
  5. удалите кодировку base 64 или используйте более плотную кодировку.

Ни один из вариантов, за исключением, возможно, первого, не уменьшит зашифрованный текст до 50% от оригинала для больших сообщений. Только создание меньшего открытого текста — для которого результат, конечно, неизвестен — или удаление основы 64 напрямую влияет на количество байтов, занятых фактическим зашифрованным текстом. Зашифрованный текст, который растет линейно с открытым текстом для CBC и большинства других режимов шифрования.

Удаление базы 64 уменьшит размер зашифрованного текста на 25% и, возможно, несколько байтов заполнения / накладных расходов. Но вам придется иметь дело с двоичным зашифрованным текстом, состоящим из байтов со случайным значением.


Таблица с расчетной экономией:

  1. сокращение / сжатие открытого текста: неизвестно;
  2. iv сокращение: максимум 16 байтов для не включенного IV;
  3. без заполнения: максимум 16 байтов, если заполнение не требуется;
  4. Сокращение HMAC: 24 байта для 8-байтового тега (опасно жить здесь);
  5. без кодировки: 25% и несколько байтов, возможно

Заметки:

  • сжатие может привести к атакам по побочным каналам — оно не было удалено из TLS без причины;
  • IV должен оставаться уникальным и — для режима CBC — случайным;
  • Уменьшение размера тега аутентификации ниже определенного порога может, конечно, снизить уровень безопасности, предлагаемый — насколько это зависит от того, как сообщения проверяются.
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector