Вторая часть: Как сделать Ruby, AES-256-CBC и PHP MCRYPT_RIJNDAEL_128 играют хорошо вместе

Thirding TagLib Sharp.

TagLib.File f = TagLib.File.Create(path);
f.Tag.Album = "New Album Title";
f.Save();

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

1 ответ

Проблема в том, что mcrypt не заполняет последний блок, тогда как привязка OpenSSL Ruby использует метод заполнения OpenSSL по умолчанию, то есть заполнение PKCS. Я не могу улучшить описание из документации OpenSSL:

Заполнение PKCS работает путем добавления n отступов байтов значения n, чтобы получить общее длина данных a кратный размеру блока. Заполнение всегда добавляется, поэтому, если данные уже есть кратное размеру блока n будет равны размеру блока. Например, если размер блока 8 и 11 байтов нужно зашифровать, затем 5 байтов заполнения будет добавлено значение 5.

Перед шифрованием вам необходимо вручную добавить соответствующие отступы в конец открытого текста в PHP. Для этого передайте свой $ cleartext через эту pkcs5_pad функцию на стороне PHP перед его шифрованием (передавая 16 в качестве размера блока).

function pkcs5_pad ($text, $blocksize)
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

Если вы также можете пойти другим путем (зашифровать в Ruby и расшифровать с помощью mcrypt), вам придется удалить байты заполнения после дешифрования.

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

15
ответ дан 3 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

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