PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
z668
Отправлено: 26 Ноября, 2015 - 00:17:52
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




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.     }
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Ноября, 2015 - 00:31:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 10418
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Цинкани:
PHP:
скопировать код в буфер обмена
  1. $size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
  2.  $iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);

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


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




По длине - один в один, 32 символа.

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



По поводу размера блока не могу сказать, незнаю. Шарп галатает все на раз. Размер блока у шарпа - 256, длина IV у шарпа 256/8=32 символа\байта согласно документации.

(Отредактировано автором: 26 Ноября, 2015 - 00:38:57)

 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Ноября, 2015 - 00:40:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 10418
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




У тебя там что, дьявольская студия? Чур меня!
z668 пишет:
как работать с hex или байтами
Любая строка бинарная, в цикле читай побайтно и все.
Спринтф тоже понимает как её вывести.
z668 пишет:
32 символа
Во первых уточни в манах, должно ли быть там для этого даел_256 + цбц реально 32.
Во вторых попробуй закриптить с этим нагенереным автоматически.
(Добавление)
Значит ему еще размер паддинга может не нравится.
 
 Top
z668
Отправлено: 26 Ноября, 2015 - 02:59:22
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Проблема найдена.
Вот статья по этому поводу: https://www[dot]chilkatsoft[dot]com/p/php_aes[dot]asp

p.s. а вы говорите "дьявольская студия", это не студия "дьявольская", это PHP - "утопия" =)

(Отредактировано автором: 26 Ноября, 2015 - 03:00:01)

 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Ноября, 2015 - 03:42:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 10418
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




О! Годно!
Надо будет глянуть.
 
 Top
z668
Отправлено: 26 Ноября, 2015 - 09:06:25
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Линк на рабочую реализацию: http://ru[dot]stackoverflow[dot]com/ques[dot][dot][dot]s-the-blocksize/

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

(Отредактировано автором: 26 Ноября, 2015 - 09:06:58)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Кодировки и все смежное »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB