#java #public-key #javacard #apdu #key-pair
#java #открытый ключ #javacard #apdu #пара ключей
Вопрос:
Я пытаюсь отправить свой открытый ключ из моей пары ключей в APDU, чтобы подпись можно было проверить в другой программе. До сих пор я не смог найти способ получить ключ в буфер APDU.
Я нашел в Интернете решения, которые используют RSAPublicKey.getExponent()
для хранения ключа в байтовом массиве (затем добавляют его в буфер), но поскольку я не использую RSAPublicKey, это было не так полезно. Это единственный способ сделать это? Нужно ли мне использовать RSAPublicKey вместо пары ключей или есть какой-то способ поместить открытый ключ из моей пары ключей в буфер APDU?
Это мой код генерации ключа:
KeyPair key = new KeyPair(KeyPair.ALG_RSA, (short)5120);
key.genKeyPair();
Ответ №1:
Во-первых, открытый ключ RSA состоит из модуля и экспоненты. Сначала вам нужно будет использовать getPublic() и восстановить объект, имеющий интерфейс RSAPublicKey, который предоставляет методы getExponent и getModulus, которые получат массивы байтов, которые вы можете поместить в буфер APDU. Публичный показатель, вероятно, будет чем-то вроде 0x010001, но модуль будет иметь длину в битах, которую вы объявляете в качестве параметра KeyPair.
Для такого длинного модуля вам понадобится расширенный APDU или разделение его на несколько обменов APDU. Для совместимости я бы обычно рекомендовал второй подход, но если вы имеете дело с системой, в которой вы уверены, что будете обрабатывать расширенный APDU на обоих концах, вы можете попробовать сделать это за один раз.
Комментарии:
1. Спасибо, могу я спросить, что вы подразумеваете под «восстановить объект с помощью RSAPublicKey»? Также с модулем и показателем степени, есть ли способ, так сказать, «перестроить» ключ на другом конце?
2. @LozCodes Это означает, что getPublicKey() возвращает объект типа PubliKey, который является абстрактным интерфейсом, реализованным классом RSAPublicKey. Итак, когда вы создаете объект keypar, специализированный для RSA, вы получите специализированный открытый ключ RSA. Это просто объектно-ориентированное программирование. Конечно, вы также можете создать открытый ключ — если на Java, то посмотрите на RSAPublicKeySpec, который имеет конструктор с модулем и показателем степени.
Ответ №2:
Передо мной нет действительной среды разработки 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);
и продолжайте отсюда…