За последние 24 часа нас посетили 64079 программистов и 1741 робот. Сейчас ищут 798 программистов ...

mcrypt_encrypt(): The IV parameter must be as long as the bl

Тема в разделе "Прочие вопросы по PHP", создана пользователем z668, 26 ноя 2015.

  1. z668

    z668 Активный пользователь

    С нами с:
    28 мар 2011
    Сообщения:
    15
    Симпатии:
    0
    PHP выдает ошибку: `mcrypt_encrypt(): The IV parameter must be as long as the blocksize`

    Что ему не нравится в векторе?
    Код (PHP):
    1.     // Ключ
    2.     $AES_Key = "93908027539382757893442837120983";
    3.     
    4.     // Вектор
    5.     $AES_IV = "33985771209830270358974938292834";
    6.     
    7.     // Методы
    8.     function encrypt($string)
    9.     {
    10.         return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $AES_Key, addpadding($string), MCRYPT_MODE_CBC, $AES_IV));
    11.     }
    12.     
    13.     function addpadding($string, $blocksize = 32)
    14.     {
    15.         $len = strlen($string);
    16.         $pad = $blocksize - ($len % $blocksize);
    17.         $string .= str_repeat(chr($pad), $pad);
    18.         return $string;
    19.     } 

    Аналогичный код на шарпе работает отлично:

    Код (PHP):
    1.     // Ключ
    2.     private const string AES_Key = "93908027539382757893442837120983";
    3.         
    4.     // Вектор
    5.     private const string AES_IV = "33985771209830270358974938292834";
    6.         
    7.     // Зашифровывает строку в AES CBC 256 PKCS7
    8.     internal static string AES_Encrypt(string inputStr)
    9.     {
    10.              byte[] xBuff = null;
    11.         
    12.              using (var aes = new RijndaelManaged())
    13.              {
    14.                   // Настройки
    15.                   aes.KeySize = 256;
    16.                   aes.BlockSize = 256;
    17.                   aes.Padding = PaddingMode.PKCS7;
    18.                   aes.Mode = CipherMode.CBC;
    19.                   aes.Key = Encoding.UTF8.GetBytes(AES_Key);
    20.                   aes.IV = Encoding.UTF8.GetBytes(AES_IV);
    21.         
    22.                   using (var ms = new MemoryStream())
    23.                   {
    24.                       using (var cs = new CryptoStream(ms, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write))
    25.                       {
    26.                            byte[] textArr = Encoding.UTF8.GetBytes(inputStr);
    27.                            cs.Write(textArr, 0, textArr.Length);
    28.                        }
    29.         
    30.                         xBuff = ms.ToArray();
    31.                    }
    32.               }
    33.         
    34.           return Convert.ToBase64String(xBuff);
    35.     } 
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: mcrypt_encrypt(): The IV parameter must be as long as th

    Посмотри готовый пример с aes из справки по функции.