3DES CBC Шифрование в PHP с 16-байтовым ключом

Я пытался сделать алгоритм 3DES в PHP. Я сделал это на Java, и он работает хорошо, но версия PHP дает мне другой результат; вот мой код:

function String2Hex($string){
$hex='';
for ($i=0; $i < strlen($string); $i++){
$hex .= dechex(ord($string[$i]));
}
return $hex;
}

function hexToAscii($inputHex) {
$inputHex = str_replace(' ', '', $inputHex);
$inputHex = str_replace('\x', '', $inputHex);
$ascii = pack('H*', $inputHex);
return $ascii;
}

$cipher = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');

$iv =  '0000000000000000';

$key = '75ABFD405D018A9BD0E66D23DA3B6DC8';
printf("KEY: %s\n", String2Hex($key));

$cleartext = '0436A6BFFFFFFFA8';
printf("<br>TEXT: %s\n\n", $cleartext);

if (mcrypt_generic_init($cipher, hexToAscii($key), $iv) != -1)
{
$cipherText = mcrypt_generic($cipher, hexToAscii($cleartext));
mcrypt_generic_deinit($cipher);

printf("<br><br>3DES encrypted:\n%s\n\n", strtoupper(bin2hex($cipherText)));
}

Это должно дать мне: 76FB62FB3AFD6677
Но это дает мне: E01BD1085F0126A2

Что я могу сделать?

1

Решение

Тройной DES определен для ключей размером 192 бит (168 бит без контроля четности). Это предполагает три независимых подраздела. Поскольку у вас есть только один 128-битный код, вам нужно разделить две клавиши на три подраздела. Поскольку 3DES обычно выполняется как схема Encrypt-Decrypt-Encrypt (EDE), первый и последний подразделы могут быть одинаковыми.

Если ваш текущий ключ K1 || K2тогда вы можете попробовать K1 || K2 || K1 или же K2 || K1 || K2 как окончательный ключ. Я попробовал это для вас, и первое предложение работает.

Кроме того, вы забыли декодировать IV из Hex. Вот полный код:

function String2Hex($string){
$hex='';
for ($i=0; $i < strlen($string); $i++){
$hex .= dechex(ord($string[$i]));
}
return $hex;
}

function hexToAscii($inputHex) {
$inputHex = str_replace(' ', '', $inputHex);
$inputHex = str_replace('\x', '', $inputHex);
$ascii = pack('H*', $inputHex);
return $ascii;
}

$cipher = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');

$iv =  '0000000000000000';

//$key = '75ABFD405D018A9BD0E66D23DA3B6DC8';
$key = '75ABFD405D018A9BD0E66D23DA3B6DC875ABFD405D018A9B';
printf("KEY: %s\n", $key);

$cleartext = '0436A6BFFFFFFFA8';
printf("<br>TEXT: %s\n\n", $cleartext);

if (mcrypt_generic_init($cipher, hexToAscii($key), hexToAscii($iv)) != -1)
{
$cipherText = mcrypt_generic($cipher, hexToAscii($cleartext));
mcrypt_generic_deinit($cipher);

printf("<br>3DES encrypted:\n%s\n\n", strtoupper(bin2hex($cipherText)));
}

Выход:

КЛЮЧ: 75ABFD405D018A9BD0E66D23DA3B6DC875ABFD405D018A9B
ТЕКСТ: 0436A6BFFFFFFFA8
3DES в зашифрованном виде: 76FB62FB3AFD6677
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]