уменьшить результаты openssl_encrypt - PullRequest
0 голосов
/ 26 апреля 2018
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==

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

1 Ответ

0 голосов
/ 26 апреля 2018

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

  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 - случайным;
  • Уменьшение размера тега аутентификации ниже определенного порога может, конечно, снизить уровень безопасности, предлагаемый - насколько это зависит от того, как сообщения проверяются.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...