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