Я пытаюсь отправить свой открытый ключ из моей пары ключей в APDU, чтобы подпись могла быть проверена в другой программе. Пока мне не удалось найти способ получить ключ в буфер APDU.

Я нашел в Интернете решения, которые используют RSAPublicKey.getExponent() для хранения ключа в байтовом массиве (затем добавляют его в буфер), но, поскольку я не использую RSAPublicKey, это не очень помогло. Это единственный способ сделать это? Нужно ли мне использовать RSAPublicKey вместо пары ключей или есть способ поместить открытый ключ из моей пары ключей в буфер APDU?

Это мой код генерации ключа:

KeyPair key = new KeyPair(KeyPair.ALG_RSA, (short)5120);
key.genKeyPair(); 
0
LozCodes 24 Фев 2021 в 19:10

2 ответа

Лучший ответ

У меня нет действующей IDE JavaCard передо мной, но что-то вроде должно работать:

KeyPair keyPair = new KeyPair(KeyPair.ALG_RSA, (short)xxx);
keyPair.genKeyPair();
RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublicKey();
short len = pubkey.getExponent(apdu.getBuffer(), (short)0);

И продолжаем отсюда ...

0
Paul Bastian 25 Фев 2021 в 13:19

Во-первых, открытый ключ RSA состоит из модуля и показателя степени. Сначала вам нужно будет использовать getPublic () и восстановить объект, имеющий интерфейс RSAPublicKey, который предоставляет методы getExponent и getModulus, которые получат массивы байтов, которые вы можете поместить в буфер APDU. Публичная экспонента, вероятно, будет чем-то вроде 0x010001, но модуль будет иметь длину в битах, которую вы объявите в качестве параметра KeyPair.

Для такого длинного модуля вам понадобится расширенный APDU или разделение его получения на несколько обменов APDU. Для совместимости я обычно рекомендую второй подход, но если вы имеете дело с системой, в которой вы уверены, что обрабатываете расширенный APDU на обоих концах, вы можете попробовать сделать это за один раз.

1
Michal Gluchowski 25 Фев 2021 в 13:32