Я кодирую модуль метода оплаты 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 в начале моих фрагментов кода.