Я надеюсь, что некоторые из вас могут помочь мне в этом вопросе.
Я использовал программу SmartCardShell для запуска кода JavaScript, который извлекает данные из британского электронного паспорта.
Я пытаюсь повторить код в Java для моей диссертации.Однако я поставлен в тупик на поколение MAC.
Код JavaScript для шифрования данных и генерации MAC-адресов:
var cryptogram = crypto.encrypt(kenc, Crypto.DES_CBC, plain, new ByteString("0000000000000000", HEX));
print("Cryptogram : " + cryptogram);'
var mac = crypto.sign(kmac, Crypto.DES_MAC_EMV, cryptogram.pad(Crypto.ISO9797_METHOD_2));
print("MAC : " + mac);
Мне удалось правильно проверить, что мой ключ шифрования (Kenc) сгенерирован правильно.
Если исходить из кода скрипта, ключ MAC (Kmac) также является тройным ключом DES, который выполняется с помощью:
byte[] kmackey = new byte[24];
System.arraycopy(kmac, 0, kmackey, 0, kmac.length);
System.arraycopy(kmac, 0, kmackey, kmac.length, 8);
System.out.println("kmackey = " + ConvertToHex.convertToHex(kmackey));
DESedeKeySpec desedekey = new DESedeKeySpec(kmackey);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
Key KMac = keyFactory.generateSecret(desedekey);
Как видно выше, код javascript «подписывает» данные ключом Kmac,механизм DES_MAC_EMV и дополняет данные криптограммы методом дополнения ISO 9797. 2, который, я считаю, называется «заполнением битами».
Может ли кто-нибудь помочь мне в создании / объяснении мне Java-эквивалента механизма DES_MAC_EMV иметод дополнения ISO 9797 2?
Оцените помощь
Просто добавьте, как я забыл упомянуть, я создаю систему для подключения к электронному паспорту и извлечения данных.В тот момент, когда я проверяю данные, полученные из программы / кода javascript SmartCardShell.Это не апплет / приложение javacard, это исключительно Java-хост-приложение
HSK