Подтвердить что ты не робот

Шифрование данных PGP для использования с Yubico OpenPGP Smart Card

Я пытаюсь реализовать шифрование PGP на основе апплета Yubikey NEO OpenPGP Smart Card в приложении Java. Кажется, это темное искусство, и нелегко это сделать Google, но вот где я до сих пор:

  • Карта инициализируется, ключи генерируются с помощью инструмента gpg. Он вообще работает. У меня есть открытый ключ в формате .asc и ему удалось загрузить его в org.bouncycastle.openpgp

  • Подключитесь к смарт-карте в USB-ключах с помощью API javax.smartcardio.

  • Выберите апплет OpenPGP

    val pgpAID = bytes(0xD2, 0x76, 0x00, 0x01, 0x24, 0x01)
    val answer = cardChannel.transmit(CommandAPDU(0x00, 0xA4, 0x04, 0x00, pgpAID))
    
  • Успешно представить правильный PIN-код на карту

    val pin = "123456"
    return bytes(0x00, 0x20, 0x00, 0x82, pin.length) + pin.toByteArray(Charsets.UTF_8)
    
  • Отправить квази-успешную (см. ниже) команду decipher

    bytes(0x00, 0x2a, 0x80, 0x86, data.size) + data + bytes(0x00)
    

    Когда data = "xxxx".toByteArray(), результат SW=9000 (= успех), но данные не возвращаются. Это наивный тест, потому что документация апплета OpenPGP на стр. 52 упоминает, что

    ввод команды (кроме байта индикатора заполнения) должен быть отформатирован в соответствии с PKCS # 1 перед шифрованием.

Я не знаю, как зашифровать данные и получить их в формате PKCS # 1.

Я также пробовал читать через тесты внедрения OpenPGP в Yubico OpenPGP, но он предоставляет только другой пример "сбоя" (строка 196). Я попытался запустить это, но результат другой: тест ожидает SW=0050 (указывает на исключение?), И я получаю SW=6f00 (Нет точного диагноза, согласно этот документ).

Я создал репозиторий GitHub со всем кодом. Это написано в Котлине, но должно быть легко читаемым.

4b9b3361

Ответ 1

Ваш вопрос несколько смущен, но я уверен, что вы хотите создать зашифрованные сообщения PGP с использованием RSA publickey, соответствующего закрытому ключу RSA на вашей смарт-карте, а затем использовать закрытый ключ RSA на смарт-карте для (помощи) их расшифровки, PGP (как и практически все остальное) использует гибридное шифрование, поэтому зашифрованное сообщение PGP в соответствующей части состоит из:

  • фактическое сообщение, зашифрованное соответствующим симметричным алгоритмом, таким как TDES или AES, с использованием произвольно созданного рабочего ключа, назовите его K
  • рабочий ключ K плюс некоторые метаданные, зашифрованные RSA, используя публикацию получателя и дополнение, определенное исходным стандартом PKCS # 1, теперь официально называемое RSAES-PKCS1-v1_5, но все еще широко упомянутое несколько неточно как PKCS1.

Вам не нужно выполнять шаги шифрования, потому что это может сделать любое программное обеспечение, реализующее стандарт, включая библиотеку GnuPG или BouncyCastle bcpg. Если вы хотите сделать это самостоятельно, возможно, для тестовых данных с использованием фальшивого K и никакого реального сообщения вам нужно сделать модульное усиление заполнения и RSA; в Java, по крайней мере, Oracle или openjdk Java со стандартными провайдерами криптографии, вы можете просто использовать javax.crypto.Cipher, полученный с помощью .getInstance("RSA/ECB/PKCS1Padding") обычным способом.

"Шифрование PKCS1" (для RSA), как описано в нижней части страницы 52 и верхней части страницы 53 этого документа, которая идентична содержимому, но не соответствует формату текущая спецификация OpenPGP (и ранее), которая относится к и фактически идентична ближнему течению PKCS # 1 spec (и ранее), все из которых говорят:

  • один байт 00
  • один байт 02
  • достаточно байт, отличных от нуля, чтобы сделать результат правильной длиной и быть безопасным
  • один байт 00
  • "открытый текст", который для шифрования PGP фактически является рабочим симметричным ключом K, отформатированным, как указано в спецификации PGP.

Обратите внимание на начало абзаца

В случае алгоритма AES

представляется для другого варианта, а не PGP AFAICS, описанного на предыдущей странице, как

По опции (объявленной в расширенных возможностях) карта поддерживает дешифровку простой текст с ключом AES, хранящимся в специальной DO (D5). Это полезно, если ни сертификат, ни публика ключ существует, и внешний мир имеет общий секрет с картой.

поэтому игнорируйте его.