Расшифруйте 3DES DUKPT в соответствии со стандартом ANSI X9.24 часть 1
У меня есть Magtek uDynamo, и я пытаюсь расшифровать трек 1. Я прочитал ниже и немного понимаю, но не знаю, как на самом деле расшифровать данные. Поставщик сказал использовать расшифровочный ключ ANSI для расшифровки, но я ничего не могу найти по этому поводу. У меня есть KSN, сессия и серийные номера. Я также попробовал некоторый код Java, который нашел, но он, похоже, не работает. Возвращает ноль или, возможно, я вставил не тот BDK. Я просто использую серийный номер для того, что я где-то читал. Я делаю это на Android. Желательно, чтобы код запускался на сервере, а не на устройстве, и передавался в зашифрованном виде вместе с HTTPS.
Как зашифрованный текст генерировался в кард-ридере с использованием шифрования DUKPT?
Подтверждение дешифрования 3DES-DUKPT (CBC)
https://github.com/yinheli/dukpt/blob/master/src/main/java/com/yinheli/tool/DukptDecrypt.java
Обновление Я хочу расшифровать 3DES DUKPT в соответствии со стандартом ANSI X9.24 часть 1
Я использую этот https://github.com/camcima/dukpt-php/tree/e8fceb4df8757e7e097c435221b4e93e097d3c9f
Мне пришлось обновить файлы и убедиться, что я получил самую последнюю версию phpseclib, и она работает, но данные появляются как C 4A fr ( Wb f7zn: W9, f7, м = zCRW
Я должен что-то упустить. Я пробовал разные режимы и пытаюсь найти кодировку. Пожалуйста, дайте мне знать, если у вас есть решение или идеи. Также их тестовые данные работают, так что я не уверен, какая разница между моими и их
Код я использую index.php в корне:
include 'vendor/autoload.php';
use DUKPT\DerivedKey;
use DUKPT\KeySerialNumber;
use DUKPT\Utility;
$encryptedHexData = 'de8bfe769dca885cf3cc312135fe2cccfacf176235f4bdee773d1865334315ed2aefcab613f1884b5d63051703d5a0e2bd5d1988eeabe641bd5d1988eeabe641';
$ksn = '00000232100117e00027';
$bdk = '0123456789ABCDEFFEDCBA9876543210';
$key = new KeySerialNumber($ksn);
$encryptionKey = DerivedKey::calculateDataEncryptionRequestKey($key, $bdk);
$actual = Utility::hex2bin(Utility::removePadding(Utility::tripleDesDecrypt($encryptedHexData, $encryptionKey, true)));
echo $encryptionKey.'<br />';
echo $actual.'<br /><br />';
1 ответ
С правильными BDK и KSN все, что вам нужно сделать сейчас, это попробовать разные режимы.
Прямо сейчас вы используете DerivedKey::calculateDataEncryptionRequestKey($key, $bdk);
Вам нужно попробовать другие режимы, чтобы выяснить, какой из них использует ваше устройство. Вот код, который я использовал, чтобы найти правильный результат для моего устройства.
include 'vendor/autoload.php';
use DUKPT\DerivedKey;
use DUKPT\KeySerialNumber;
use DUKPT\Utility;
$encryptedHexData = 'C25C1D1197D31CAA87285D59A892047426D9182EC11353C051ADD6D0F072A6CB3436560B3071FC1FD11D9F7E74886742D9BEE0CFD1EA1064C213BB55278B2F12';
$ksn = 'FFFF9876543210E00008';
$bdk = '0123456789ABCDEFFEDCBA9876543210';
$key = new KeySerialNumber($ksn);
$encryptionKey = DerivedKey::calculatePinEncryptionKey($key, $bdk);
$decryptedOutput = Utility::hex2bin(Utility::tripleDesDecrypt($encryptedHexData, $encryptionKey, true));
echo '<br /><br />Pin Encryption Key: '.$encryptionKey;
echo '<br />Decrypted Output: '.$decryptedOutput;
$encryptionKey = DerivedKey::calculateMacRequestKey($key, $bdk);
$decryptedOutput = Utility::hex2bin(Utility::tripleDesDecrypt($encryptedHexData, $encryptionKey, true));
echo '<br /><br />Mac Request Key: '.$encryptionKey;
echo '<br />Decrypted Output: '.$decryptedOutput;
$encryptionKey = DerivedKey::calculateMacResponseKey($key, $bdk);
$decryptedOutput = Utility::hex2bin(Utility::tripleDesDecrypt($encryptedHexData, $encryptionKey, true));
echo '<br /><br />Mac Response Key: '.$encryptionKey;
echo '<br />Decrypted Output: '.$decryptedOutput;
$encryptionKey = DerivedKey::calculateDataEncryptionRequestKey($key, $bdk);
$decryptedOutput = Utility::hex2bin(Utility::tripleDesDecrypt($encryptedHexData, $encryptionKey, true));
echo '<br /><br />Data Encryption Request Key: '.$encryptionKey;
echo '<br />Decrypted Output: '.$decryptedOutput;
$encryptionKey = DerivedKey::calculateDataEncryptionResponseKey($key, $bdk);
$decryptedOutput = Utility::hex2bin(Utility::tripleDesDecrypt($encryptedHexData, $encryptionKey, true));
echo '<br /><br />Data Encryption Response Key: '.$encryptionKey;
echo '<br />Decrypted Output: '.$decryptedOutput;
Таким образом, для этого BDK и KSN ниже приводится результат.
Pin Encryption Key: 27F66D5244FF621EAA6F6120EDEB427F
Decrypted Output: %B5452300551227189^HOGAN/PAUL ^08043210000000725000000?
Mac Request Key: 27F66D5244FF9DE1AA6F6120EDEBBD80
Decrypted Output: W����U�P�TfB/`����þ&��f��3y;�U�Zy��UK�[��s�;�>�[�b
Mac Response Key: 27F66D52BBFF62E1AA6F612012EB4280
Decrypted Output: b�K2a�S0��9�Mb-����*L�J���� ��s�\���H�����=���e�]�,���Hwq�
Data Encryption Request Key: C39B2778B058AC376FB18DC906F75CBA
Decrypted Output: RA]�ԅⱰQ���'v}b��h��St�����?� lu/�ٵ�P��!���6�� �
Data Encryption Response Key: 846E267CB822197406DA2B161191C6E4
Decrypted Output: ��,�B^FZ�� ςs�c���*E�4��0��ǂ}����6`-P�b�ʞ̳aصĬ�&���+��