我试图在Java应用程序中实现基于Yubikey NEO OpenPGP智能卡applet的PGP加密。这似乎是一门黑暗的艺术,在谷歌上搜索并不容易,但我到目前为止取得的成果如下:
.asc格式的公钥,并设法将其加载到org.bouncycastle.openpgp中。javax.smartcardio API连接到using中的智能卡。decipher命令(见下文)
字节(0x00,0x2a,0x80,0x86,data.size) +数据+字节(0x00)
当data = "xxxx".toByteArray()时,结果是SW=9000 (= success),但不返回数据。这是一个幼稚的测试,因为第52页的OpenPGP小程序文档提到
在加密之前,命令输入(填充指示符字节除外)应按照PKCS#1格式进行格式化。我不知道如何加密数据并将其转换成PKCS#1格式.
我还试着通过Yubico OpenPGP卡实现测试阅读,但它只提供了另一个“失败”的例子(第196行)。我试着运行它,但是结果不同:测试期望SW=0050 (表示异常?)我得到的是SW=6f00 (据本文件说,没有精确诊断)。
我用整个代码创建了一个GitHub存储库。它是用科特林写的,但应该很容易读懂。
发布于 2015-11-22 20:28:18
您的问题有点混乱,但我确信您希望使用与智能卡上RSA私钥相对应的RSA公钥创建PGP加密消息,然后使用智能卡上的RSA私钥来(帮助)解密它们。PGP (与其他所有内容一样)使用混合加密,因此相关部分中的PGP加密消息包括:
您不需要执行加密步骤,因为实现该标准的任何软件都可以这样做,包括GnuPG或Bouncy城堡的bcpg库。如果您想自己做这件事,也许是为了使用伪造的K测试数据,而不是真正的消息,那么您需要做填充和RSA模块幂运算;在Java中,至少在Oracle或openjdk中,标准密码提供者可以使用用.getInstance("RSA/ECB/PKCS1Padding")获得的.getInstance("RSA/ECB/PKCS1Padding")以通常的方式获得的数据。
"PKCS1“加密填充(适用于RSA)是在该文档的第52页底部和第53页顶部描述的,它的内容与当前OpenPGP规范 (和更早时)的格式相同,当前OpenPGP规范指的是并且实际上与近流PKCS#1规范 (和更早的版本)相同,所有这些都说是:
注意开头的一段
在AES算法中
似乎是针对另一个选项,而不是PGP AFAICS,在上一页中描述为
通过选项(在扩展功能中宣布),该卡支持使用存储在特殊DO (D5)中的AES密钥对纯文本进行解密。这是有用的,如果没有证书或公钥存在,外部世界有一个共同的秘密与卡。
所以忽略它吧。
https://stackoverflow.com/questions/33841380
复制相似问题