Шифрование данных PGP для использования со смарт-картой Yubico OpenPGP

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

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

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

  3. Выберите апплет OpenPGP

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

    val pin = "123456"
    return bytes(0x00, 0x20, 0x00, 0x82, pin.length) + pin.toByteArray(Charsets.UTF_8)
    
  5. # P6 #
    bytes(0x00, 0x2a, 0x80, 0x86, data.size) + data + bytes(0x00)
    
    # P7 #
    # P8 #

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

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

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


person atok    schedule 21.11.2015    source источник
comment
О, у вас уже есть вопрос. Обратите внимание, что вы можете захотеть подключиться с использованием протокола T = 1 вместо T = 0, и что не все карты поддерживают увеличенную длину. В противном случае вам, возможно, придется изучить ISO / IEC 7816-4 объединение команд.   -  person Maarten Bodewes    schedule 22.11.2015


Ответы (1)


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

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

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

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

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

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

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

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

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

так что игнорируйте это.

person dave_thompson_085    schedule 22.11.2015