DES-шифрование в PHP - PullRequest
       14

DES-шифрование в PHP

1 голос
/ 16 августа 2011

Я кодирую модуль метода оплаты Drupal, и в этом мне нужно создать хеш для отправки в банк. Банк просит меня кодировать определенные строки в хэш DES / ECB. Они также обеспечивают тестовую среду, и здесь возникает моя проблема. Со строкой B7DC02D5D6F2689E и ключом 7465737465703031 я должен получить хеш результата 3627C7356B25922B (после bin2hex, конечно). Это на тестовой странице банка, и я также проверил это на этой странице: http://www.riscure.com/tech-corner/online-crypto-tools/des.html (Java-апплет шифрования).

Моя проблема в том, что, что бы я ни делал, я не могу получить свой PHP-код для получения правильного результата. Это простая функция, которую я пытаюсь использовать:

function encrypt($hash, $key)
{
$hash = strtoupper(substr(sha1($hash), 0, 16));
$key = strtoupper(bin2hex($key));

$block = mcrypt_get_block_size('des', 'ecb');
if (($pad = $block - (strlen($hash) % $block)) < $block) {
  $hash .= str_repeat(chr($pad), $pad);
}

$sig = strtoupper(bin2hex(mcrypt_encrypt(MCRYPT_DES, $key, $hash, MCRYPT_MODE_ECB)));
return $sig;
}

и я тоже так пробую:

function encrypt( $value, $key) {
$hash = strtoupper(substr(sha1($value), 0, 16));
$key = strtoupper(substr(bin2hex($key), 0, 16));
// encrypt hash with key
if (function_exists('mcrypt_module_open')) {         // We have mcrypt 2.4.x
  $td = mcrypt_module_open(MCRYPT_DES, "", MCRYPT_MODE_ECB, "");
  $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
  mcrypt_generic_init($td, $key, $iv);
  $signature = strtoupper(bin2hex(mcrypt_generic ($td, $hash)));
  mcrypt_generic_end ($td);
}
else
{                        // We have 2.2.x only
$signature = strtoupper(bin2hex(mcrypt_ecb (MCRYPT_3DES, $key, $hash, MCRYPT_ENCRYPT)));
}
return $signature;
}

Ни один из них не дал правильную подпись. Есть идеи, что случилось? Сейчас я занимаюсь этой проблемой более 3 часов, поэтому я ценю любую помощь. Я не очень знаком с этим шифрованием. Большое спасибо.

Кстати: эти $ hash и $ key, упомянутые выше, идут после функций strtoupper, substr и bin2hex в начале моих фрагментов кода.

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Простое решение:

function encrypt($hash, $key) {
    return mcrypt_encrypt("des", pack("H*", $key), pack("H*", $hash), "ecb");
}

print bin2hex(encrypt("B7DC02D5D6F2689E", "7465737465703031"));

Это печатает 3627c7356b25922b для меня, так что похоже, что это работает.

Вы были на правильном пути с bin2hex(), но это было преобразование в неправильном направлении. (К сожалению, функции hex2bin() нет, поэтому вместо нее нужно использовать pack().)

Вам также не нужен IV для одноблочного шифрования, подобного этому.

0 голосов
/ 16 августа 2011

Ваш обычный текст, B7DC02D5D6F2689E, составляет 8 байтов = 64 бита.Это точный блок для DES, поэтому вам не нужно заполнять его в режиме ECB.Я предлагаю полностью удалить код заполнения.В этом случае все, что нужно DEC-ECB - это блок для шифрования и ключ;нет набивки и нет IV.

...