用于Yubico OpenPGP智能卡的PGP数据加密
我正在尝试在Java应用程序中实现基于Yubikey NEO OpenPGP智能卡小程序的PGP加密。这似乎是一种黑暗艺术,在谷歌上搜索这些东西并不容易,但这是我到目前为止得到的地方:
卡已初始化,密钥使用gpg工具生成。它通常有效。我有我的公钥格式,并设法将其加载到
.asc
org.bouncycastle.openpgp
使用 API 连接到 USB 硬件保护装置中的智能卡。
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)
当 时,结果为 (= 成功),但不返回任何数据。这是一个幼稚的测试,因为第52页上的OpenPGP小程序文档提到
data = "xxxx".toByteArray()
SW=9000
命令输入(填充指示符字节除外)应在加密前根据 PKCS#1 进行格式化。
我不知道如何加密数据并将其转换为PKCS#1格式。
我还尝试阅读Yubico OpenPGP卡实现测试,但它只提供了另一个“失败”的例子(第196行)。我尝试运行它,但结果是不同的:测试期望(指示异常?)并且我得到的是(根据本文档,没有精确的诊断)。SW=0050
SW=6f00
我用整个代码创建了一个GitHub存储库。它是用 Kotlin 编写的,但应该易于阅读。