【发布时间】:2015-11-21 08:36:18
【问题描述】:
我正在尝试在 Java 应用程序中实现基于 Yubikey NEO OpenPGP 智能卡小程序的 PGP 加密。这似乎是一门黑暗的艺术,用谷歌搜索这些东西并不容易,但这是我到目前为止的地方:
卡已初始化,使用 gpg 工具生成密钥。它通常有效。我有
.asc格式的公钥并设法将其加载到org.bouncycastle.openpgp使用
javax.smartcardioAPI 连接到 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(= 成功)但没有返回数据。这是一个幼稚的测试,因为第 52 页上的 OpenPGP applet documentation 提到了这一点命令输入(填充指示字节除外)应为 加密前根据PKCS#1格式化。
我不知道如何加密数据并将其转换为 PKCS#1 格式。
我也尝试阅读Yubico OpenPGP card implementation tests,但它只提供了另一个“失败”示例(第 196 行)。我尝试运行它,但结果不同:测试需要SW=0050(表示异常?),我得到的是SW=6f00(没有精确诊断,根据this document)。
我用整个代码创建了一个GitHub repository。它是用 Kotlin 编写的,但应该易于阅读。
【问题讨论】:
-
哦,你这里已经有问题了。请注意,您可能希望使用 T=1 协议而不是 T=0 进行连接,并且并非所有卡都支持扩展长度。否则,您可能需要查看 ISO/IEC 7816-4 命令链接。
标签: java encryption smartcard openpgp yubico