mcrypt_decrypt (): полученный вектор инициализации размера - PullRequest
0 голосов
/ 18 декабря 2018

Столкнулся с проблемой, связанной с шифрованием.Вернее расшифровать.Некоторые из моих пользователей получают следующую ошибку:

mod_fcgid: stderr: PHP Предупреждение: mcrypt_decrypt (): получен вектор инициализации размера 10, но для этого режима шифрования требуется размер 16 в ...

или

mod_fcgid: stderr: PHP Предупреждение: mcrypt_decrypt (): получен вектор инициализации размера 30, но для этого режима шифрования в ... * требуется размер 16 для этого режима шифрования ...

У кого есть эта ошибка - не может войти.

Эта ошибка возникает у одного из ста человек.Я просто не могу понять, с чем это связано.Я читал в просторах Stackoverflow, что это связано с тем, что не хватает "\ 0" .Все советы не помогли мне, к сожалению.Как быть?Я не хочу менять метод шифрования.Меня это вполне устраивает, не считая этой ошибки.

Расшифруйте код:

function decrypt($text, $pkey)
{
    $key = $pkey;   
    $text = base64_decode($text); 
    $IV = substr($text, strrpos($text, "-[--IV-[-") + 9);
    $text = str_replace("-[--IV-[-".$IV, "", $text);

    return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $IV), "\0");
}

Попробуйте (не помогло, к сожалению):

function pad_key($key){
    if(strlen($key) > 32) return false;
    $sizes = array(16,24,32);
    foreach($sizes as $s){
        while(strlen($key) < $s) $key = $key."\0";
        if(strlen($key) == $s) break; // finish if the key matches a size
    }
    return $key;
}

PHP ver: 5.6

Добавлено (метод шифрования C #):

public static string EncryptMessage(byte[] text, string key)
{
    RijndaelManaged aes = new RijndaelManaged();
    aes.KeySize = 128;
    aes.BlockSize = 128;
    aes.Padding = PaddingMode.Zeros;
    aes.Mode = CipherMode.CBC;

    aes.Key = Encoding.Default.GetBytes(key);
    aes.GenerateIV();

    string IV = ("-[--IV-[-" + Encoding.Default.GetString(aes.IV));

    ICryptoTransform AESEncrypt = aes.CreateEncryptor(aes.Key, aes.IV);
    byte[] buffer = text;

    return Convert.ToBase64String(Encoding.Default.GetBytes(Encoding.Default.GetString(AESEncrypt.TransformFinalBlock(buffer, 0, buffer.Length)) + IV));
}

1 Ответ

0 голосов
/ 19 декабря 2018

Скорее всего, ошибка была связана с кодировкой по умолчанию в моем коде шифрования.https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.default?redirectedfrom=MSDN&view=netframework-4.7.2#System_Text_Encoding_Default (предупреждающее сообщение).

...