[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: криптография rijndael-256
Hevmal
Приветствую всех.

Подскажите пожалуйста, как влияет $iv на результат криптографии
rijndael-256?

Смысл вот в чём, нужно с устройства передать на сервер защищённую
информацию, есть ключ, известен обоим сторонам, есть сообщение,
которое необходимо зашифровать, есть криптоалгоритм
aes (rijndael-256) для контроллера.

Криптоалгоритм на контроллере
имеет только ключ и сообщение, которое необходимо зашифровать.

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

Судя по всему от $iv зависит результат выхода, также как и входа, криптографии на php и объединить две системы у меня пока не получается.

Спасибо всем за внимание, заранее благодарю за помощь.



Спустя 30 минут, 37 секунд (31.01.2011 - 14:18) twin написал(а):
Вектор тоже должен быть одинаковым. А вообще код показал бы.

Спустя 32 минуты, 45 секунд (31.01.2011 - 14:51) Hevmal написал(а):
Меня больше интересует та часть что в стандартном криптоалгоритме
нет IV. Есть только данные и ключ. Или я не прав и вектор просто прописан жёстко в таблицах перекодирования?

Изначально с помощью ключа формируется таблица [15][8][4] байт, которая смешивается и переставляется с данными, и получается криптованный текст.

Вообще алгоритм для контроллера взят из crypto-lib-avr (rijndael-256), но это не важно.

Интересно как меняется криптованное сообщение при изменении IV?
Смешивается он с данными на этапе кодирования или после создания закодированного кода каким-нибудь алгоритмом подмешивается?


Интересен следующий код, найденный на просторах инета:
<?
// Encrypt Function
function mc_encrypt($encrypt, $mc_key) {
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($encrypt), MCRYPT_MODE_ECB, $iv));
$encode = base64_encode($passcrypt);
return $encode;
}

// Decrypt Function
function mc_decrypt($decrypt, $mc_key) {
$decoded = base64_decode($decrypt);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv));
return $decrypted;
}
?>


В данном случае $iv создаётся заново и при кодировании, и при декодировании.
Возможен же вариант что я закодирую код сегодня, а раскодировать буду через месяц, соответственно $iv будет однозначно различный. Но в данном
случае это вроде-бы роли не играет. Главное чтобы ключ был одинаков.

Свой код могу выложить попозже, пока его нет у меня с собой.

Спустя 1 час, 43 минуты, 32 секунды (31.01.2011 - 16:35) Snus написал(а):
Hevmal
Пользуйся

<?php

function
EnDeCrypt($text, $s = 1, $key = 'this_is_default_key'){
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
switch ($s) {
case '0':
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, $iv));
break;
case '1':
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv));
break;
default:
return FALSE;
break;
}
}



$text = 'Hello, World!';
echo '<p>'.$text.'</p>';

$encrypt = EnDeCrypt($text);
echo '<p>'.$encrypt.'</p>';

$decrypt = EnDeCrypt($encrypt, 0);
echo '<p>'.$decrypt.'</p>';

?>



Спустя 4 минуты, 1 секунда (31.01.2011 - 16:39) twin написал(а):
Цитата
Hevmal
Пользуйся
И что это?
Ты сам то пробовал эту функцию?

Спустя 3 минуты, 5 секунд (31.01.2011 - 16:42) Snus написал(а):
twin
Пробовал. А что тебе не нравится в ней?

Спустя 8 секунд (31.01.2011 - 16:42) twin написал(а):
Цитата
Возможен же вариант что я закодирую код сегодня, а раскодировать буду через месяц, соответственно $iv будет однозначно различный. Но в данном
случае это вроде-бы роли не играет. Главное чтобы ключ был одинаков.
Вектор, это не секретная информация. Наличие вектора не снижает крипкостойкость алгоритма. Главное, как ты сам заметил, чтобы он был одинаковым.

Спустя 42 секунды (31.01.2011 - 16:42) twin написал(а):
Цитата
Пробовал. А что тебе не нравится в ней?
То, что она не рабочая в части расшифровки.

Спустя 2 минуты (31.01.2011 - 16:44) Snus написал(а):
twin
Я ее выдернул из рабочего кода.
Вот результат

Hello, World!

WFr9N1mR1WdAqGwn3XnD1Nrr4FwRZ0J8QsAp5XfXBes=

Hello, World!

У тебя что показывает?

Спустя 6 минут, 16 секунд (31.01.2011 - 16:51) twin написал(а):
Да, чет я тут прогнал. Не так запустил. Да, рабочая функция, молодец.

Спустя 1 минута, 21 секунда (31.01.2011 - 16:52) Snus написал(а):
twin
tongue.gif

Спустя 6 часов, 23 минуты, 34 секунды (31.01.2011 - 23:16) Hevmal написал(а):
Спасибо конечно, но криптовать и декриптовать на php я умею.
Я не могу поженить криптованное сообщение, сформированное в микроконтроллере,
т.к. там нет $iv, а есть только сообщение и ключ, и криптоалгоритм заложенный в php.

На счёт необходимости одинакового $iv я сделал небольшой тестик.
Код и результат ниже:

// Encrypt Function
function mc_encrypt($encrypt, $mc_key) {
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
printf("iv for encrypted text: %s<br>", bin2hex($iv));
$passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($encrypt), MCRYPT_MODE_ECB, $iv));
$encode = base64_encode($passcrypt);
return $encode;
}

// Decrypt Function
function mc_decrypt($decrypt, $mc_key) {
$decoded = base64_decode($decrypt);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
printf("iv for decrypted text: %s<br>", bin2hex($iv));
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv));
return $decrypted;
}

$text = 'Test message 1234567890 qwertyuiopasdfgjkl;zxcvbnm';
$mystr = mc_encrypt($text, '12345678901234561234567890123456');
$mystr2 = mc_decrypt($mystr, '12345678901234561234567890123456');

echo '<br>RESULT<br><br>';
echo 'Encrypted text : '.$text.'<br>';
echo 'Crypted message: '.$mystr.'<br>';
echo 'Decrypted text : '.$mystr2.'<br>';


Результат следующий:

iv for encrypted text: 4c30fb16dc650b09b49fcefc2223cc636fdc1311bce251f51ca4d23c003e6535
iv for decrypted text: 1846cfb5f99eb9e3c153d7b79d38e8a015c4d3b055f59d4339baf0429d4c6f61

RESULT

Encrypted text : Test message 1234567890 qwertyuiopasdfgjkl;zxcvbnm
Crypted message: j7siRewNRURUfJaY08yk8xdGHhGjCM2uj5yL7KsCTqwhEJD4rYjyEAswWrMB/AyJmMigoHW7NUxU7tw4fYL3XA==
Decrypted text : Test message 1234567890 qwertyuiopasdfgjkl;zxcvbnm


Соответственно при шифровании и расшифровке явно были абсолютно разные $iv, но тем не менее, всё работает нормально.


Ну ладно, спасибо конечно, буду дальше сам разбираться.
Походу алгоритм в контроллере как-то по другому считает, а здесь $iv вообще
не при чём.

Спустя 1 месяц, 25 дней, 18 часов, 22 минуты, 7 секунд (27.03.2011 - 16:38) Guest написал(а):
eeeee

Спустя 20 минут, 13 секунд (27.03.2011 - 16:58) Trianon написал(а):
Snus
Идеальная подтасовка фактов, ничего не скажешь. sad.gif

Инит-вектор применяется в режимах шифрования CBC, CFB, OFB (и для некоторых методов в режиме STREAM)

Данный пример проходит тест лишь потому что в режиме ECB инит-вектор не используется в принципе.
Попробуйте поменять к примеру на MCRYPT_MODE_CBC - тест грохнется тут же.
До тех пор, как минимум, пока инит-верторы операций шифрования и расшифрования не сравняются.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.