Я должен Обрезать Дешифрованную Строку после mcrypt_decrypt?

Вам не всегда нужна база данных.

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

-
Bmb

12
задан Community 23 May 2017 в 12:33
поделиться

2 ответа

На самом деле оба mcrypt_encrypt () и mcrypt_decrypt () , а также другие функции шифрования / дешифрования (например, mcrypt_generic () или mdecrypt_generic () ) do дополните параметр $ data длиной n * <> . Символ заполнения - это символ NUL ( \ x0 или \ 0 ), тогда как <> зависит от шифра и используемые режимы блочного шифрования. Вам следует взглянуть на режимы работы блочного шифра и Padding (криптография) .

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

cast-128
    cbc: 8 bytes
    cfb: 8 bytes
    ctr: 8 bytes
    ecb: 8 bytes
    ncfb: 8 bytes
    nofb: 8 bytes
    ofb: 8 bytes
    stream: not supported
gost
    cbc: 8 bytes
    cfb: 8 bytes
    ctr: 8 bytes
    ecb: 8 bytes
    ncfb: 8 bytes
    nofb: 8 bytes
    ofb: 8 bytes
    stream: not supported
rijndael-128
    cbc: 16 bytes
    cfb: 16 bytes
    ctr: 16 bytes
    ecb: 16 bytes
    ncfb: 16 bytes
    nofb: 16 bytes
    ofb: 16 bytes
    stream: not supported
twofish
    cbc: 16 bytes
    cfb: 16 bytes
    ctr: 16 bytes
    ecb: 16 bytes
    ncfb: 16 bytes
    nofb: 16 bytes
    ofb: 16 bytes
    stream: not supported
arcfour
    cbc: not supported
    cfb: not supported
    ctr: not supported
    ecb: not supported
    ncfb: not supported
    nofb: not supported
    ofb: not supported
    stream: 1 bytes
cast-256
    cbc: 16 bytes
    cfb: 16 bytes
    ctr: 16 bytes
    ecb: 16 bytes
    ncfb: 16 bytes
    nofb: 16 bytes
    ofb: 16 bytes
    stream: not supported
loki97
    cbc: 16 bytes
    cfb: 16 bytes
    ctr: 16 bytes
    ecb: 16 bytes
    ncfb: 16 bytes
    nofb: 16 bytes
    ofb: 16 bytes
    stream: not supported
rijndael-192
    cbc: 24 bytes
    cfb: 24 bytes
    ctr: 24 bytes
    ecb: 24 bytes
    ncfb: 24 bytes
    nofb: 24 bytes
    ofb: 24 bytes
    stream: not supported
saferplus
    cbc: 16 bytes
    cfb: 16 bytes
    ctr: 16 bytes
    ecb: 16 bytes
    ncfb: 16 bytes
    nofb: 16 bytes
    ofb: 16 bytes
    stream: not supported
wake
    cbc: not supported
    cfb: not supported
    ctr: not supported
    ecb: not supported
    ncfb: not supported
    nofb: not supported
    ofb: not supported
    stream: 1 bytes
blowfish-compat
    cbc: 8 bytes
    cfb: 8 bytes
    ctr: 8 bytes
    ecb: 8 bytes
    ncfb: 8 bytes
    nofb: 8 bytes
    ofb: 8 bytes
    stream: not supported
des
    cbc: 8 bytes
    cfb: 8 bytes
    ctr: 8 bytes
    ecb: 8 bytes
    ncfb: 8 bytes
    nofb: 8 bytes
    ofb: 8 bytes
    stream: not supported
rijndael-256
    cbc: 32 bytes
    cfb: 32 bytes
    ctr: 32 bytes
    ecb: 32 bytes
    ncfb: 32 bytes
    nofb: 32 bytes
    ofb: 32 bytes
    stream: not supported
serpent
    cbc: 16 bytes
    cfb: 16 bytes
    ctr: 16 bytes
    ecb: 16 bytes
    ncfb: 16 bytes
    nofb: 16 bytes
    ofb: 16 bytes
    stream: not supported
xtea
    cbc: 8 bytes
    cfb: 8 bytes
    ctr: 8 bytes
    ecb: 8 bytes
    ncfb: 8 bytes
    nofb: 8 bytes
    ofb: 8 bytes
    stream: not supported
blowfish
    cbc: 8 bytes
    cfb: 8 bytes
    ctr: 8 bytes
    ecb: 8 bytes
    ncfb: 8 bytes
    nofb: 8 bytes
    ofb: 8 bytes
    stream: not supported
enigma
    cbc: not supported
    cfb: not supported
    ctr: not supported
    ecb: not supported
    ncfb: not supported
    nofb: not supported
    ofb: not supported
    stream: 1 bytes
rc2
    cbc: 8 bytes
    cfb: 8 bytes
    ctr: 8 bytes
    ecb: 8 bytes
    ncfb: 8 bytes
    nofb: 8 bytes
    ofb: 8 bytes
    stream: not supported
tripledes
    cbc: 8 bytes
    cfb: 8 bytes
    ctr: 8 bytes
    ecb: 8 bytes
    ncfb: 8 bytes
    nofb: 8 bytes
    ofb: 8 bytes
    stream: not supported

Следовательно, вы должны rtrim () вывод функций дешифрования, чтобы получить исходную строку, если ваш шифр работает с блоками фиксированной длины:

$output = rtrim($decrypted, "\0");
18
ответ дан 2 December 2019 в 05:04
поделиться

В моей реализации TripleDES я обнаружил, что расшифрованная строка была дополнена символами \ 5 или \ 6. Это не ожидаемые символы \ 0 или \ 4, упомянутые выше или в примерах PHP.net. Чтобы определить значение ASCII символа заполнения, используйте функцию ord () . ord () работает с одним символом, поэтому используйте str_split (), чтобы разбить строку или получить прямой доступ к символу с помощью записи массива - $ string [5].

Окончательный результат обрезки - trim ($ decrypt, "\ 0 .. \ 32");

Окончательный результат кода -

    $key        = "encryption key";
    $encrypt    = base64_decode($encrypt);
    $iv_size    = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_ECB);
    $iv         = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypt    = mcrypt_decrypt(MCRYPT_3DES, $key, $encrypt, MCRYPT_MODE_ECB, $iv);
    $final      = trim($decrypt, "\0..\32"); // removes potential null padding
8
ответ дан 2 December 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: