Подскажите пожалуйста, как влияет $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?
Смешивается он с данными на этапе кодирования или после создания закодированного кода каким-нибудь алгоритмом подмешивается?
Интересен следующий код, найденный на просторах инета:
В данном случае $iv создаётся заново и при кодировании, и при декодировании.
Возможен же вариант что я закодирую код сегодня, а раскодировать буду через месяц, соответственно $iv будет однозначно различный. Но в данном
случае это вроде-бы роли не играет. Главное чтобы ключ был одинаков.
Свой код могу выложить попозже, пока его нет у меня с собой.
нет 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

Спустя 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 вообще
не при чём.
Я не могу поженить криптованное сообщение, сформированное в микроконтроллере,
т.к. там нет $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
Идеальная подтасовка фактов, ничего не скажешь.
Инит-вектор применяется в режимах шифрования CBC, CFB, OFB (и для некоторых методов в режиме STREAM)
Данный пример проходит тест лишь потому что в режиме ECB инит-вектор не используется в принципе.
Попробуйте поменять к примеру на MCRYPT_MODE_CBC - тест грохнется тут же.
До тех пор, как минимум, пока инит-верторы операций шифрования и расшифрования не сравняются.
Идеальная подтасовка фактов, ничего не скажешь.

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