Форумы портала PHP.SU » » Кодировки и все смежное » mcrypt_encrypt(): The IV parameter must be as long

Страниц (1): [1]
 

1. z668 - 26 Ноября, 2015 - 00:17:52 - перейти к сообщению
PHP выдает ошибку: `mcrypt_encrypt(): The IV parameter must be as long as the blocksize`

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



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

CODE (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. DeepVarvar - 26 Ноября, 2015 - 00:31:38 - перейти к сообщению
Цинкани:
PHP:
скопировать код в буфер обмена
  1. $size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
  2.  $iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);

И сравни чем они вообще там отличаются (то что ты руками забил, и то что он выдаст).
Ему не нравится размер (блока?).
3. z668 - 26 Ноября, 2015 - 00:36:42 - перейти к сообщению
По длине - один в один, 32 символа.

Т.к. в PHP без понятия как работать с hex или байтами - вывел $iv строкой, вот что получилось:



По поводу размера блока не могу сказать, незнаю. Шарп галатает все на раз. Размер блока у шарпа - 256, длина IV у шарпа 256/8=32 символа\байта согласно документации.
4. DeepVarvar - 26 Ноября, 2015 - 00:40:02 - перейти к сообщению
У тебя там что, дьявольская студия? Чур меня!
z668 пишет:
как работать с hex или байтами
Любая строка бинарная, в цикле читай побайтно и все.
Спринтф тоже понимает как её вывести.
z668 пишет:
32 символа
Во первых уточни в манах, должно ли быть там для этого даел_256 + цбц реально 32.
Во вторых попробуй закриптить с этим нагенереным автоматически.
(Добавление)
Значит ему еще размер паддинга может не нравится.
5. z668 - 26 Ноября, 2015 - 02:59:22 - перейти к сообщению
Проблема найдена.
Вот статья по этому поводу: https://www[dot]chilkatsoft[dot]com/p/php_aes[dot]asp

p.s. а вы говорите "дьявольская студия", это не студия "дьявольская", это PHP - "утопия" =)
6. DeepVarvar - 26 Ноября, 2015 - 03:42:19 - перейти к сообщению
О! Годно!
Надо будет глянуть.
7. z668 - 26 Ноября, 2015 - 09:06:25 - перейти к сообщению
Линк на рабочую реализацию: http://ru[dot]stackoverflow[dot]com/ques[dot][dot][dot]s-the-blocksize/

p.s. объяснение в комментариях.

 

Powered by ExBB FM 1.0 RC1