简单介绍一下OpenPGP卡
如果有使用过YubiKey/CanoKey的话,对其中的OpenPGP支持应该不陌生。
其中YubiKey实现了OpenPGP Card标准,这是一个基于硬件加密的密钥保护标准。
可以配合GPG使用。
本文介绍一种使用JavaCard DIY一个OpenPGP Card的方案。可作为YubiKey方案的一个低成本补充。
有兴趣的朋友可以尝试一下。
准备工作
硬件准备
- 支持JavaCard 3.0.4+以上标准的JavaCard CPU卡。
- 我使用的是NXP JCOP4 P71 J3R180卡,某宝上45元左右。
- CPU卡读卡器
- 支持PCSC/CCID/ISO7816协议的,某宝上50左右
软件准备
- JDK8
- 编译过程需要使用,高版本的JDK有兼容问题,没有Java开发经验的话,最好直接使用JDK8
- JCDK 3.0.5编译工具,用于
- 根据系统环境,从Oracle官网搜索后下载对应版本
- SmartPGP开源代码仓库
- https://github.com/ANSSI-FR/SmartPGP
- git clone或直接http下载zip包都可以
- GlobalPlatformPro工具gp.jar。用于将SmartCap写入到JavaCard中
- apache ant。SmartPGP使用了ant进行构建
制作流程
graph TD; set-env[设置环境变量] --> compile[编译SmartPGP] --> write-card[写入SmartPGP到Java卡] --> test[测试一下是否工作正常];
设置环境变量(Windows)
set JAVA_HOME=JDK8安装路径
set JC_HOME=JCDK3.0.5安装路径
编译SmartPGP
考虑到内存占用SmartPGP默认的内存使用只能支持到RSA2048。
但是J3R180卡实际可以支持RSA4096。需要修改代码中的常量以支持使用RSA4096。
diff --git a/src/fr/anssi/smartpgp/Constants.java b/src/fr/anssi/smartpgp/Constants.java
index 421baa3..d1d8890 100644
--- a/src/fr/anssi/smartpgp/Constants.java
+++ b/src/fr/anssi/smartpgp/Constants.java
@@ -25,7 +25,7 @@ import javacard.framework.*;
public final class Constants {
protected static final short INTERNAL_BUFFER_MAX_LENGTH =
- (short)0x500;
+ (short)0x730;
protected static final short APDU_MAX_LENGTH = (short)0x400;
J3R180除支持使用RSA4096,同时也支持卡内直接生成RSA4096。
但是实测下来生成速度有些慢(10s左右),不介意的话也可以自行修改。
--- a/src/fr/anssi/smartpgp/Constants.java
+++ b/src/fr/anssi/smartpgp/Constants.java
@@ -219,7 +219,7 @@ public final class Constants {
protected static final byte[] ALGORITHM_ATTRIBUTES_DEFAULT = {
(byte)0x01, /* RSA */
- (byte)0x08, (byte)0x00, /* 2048 bits modulus */
+ (byte)0x10, (byte)0x00, /* 4096 bits modulus */
(byte)0x00, (byte)0x11, /* 65537 = 17 bits public exponent */
(byte)0x03 /* crt form with modulus */
};
(END)
smartpgp中默认的javacard pkg/applet aid只能用于测试。
如果想自己修改,可编译build.xml修改。完成后再进行编译
cd smartpgp下载路径
ant
写入SmartPGP到Java卡
rem 执行写入
java -jar gp.jar -install SmartPGPApplet.cap
rem 检查写入结果
java -jar gp.jar -list
rem 输出结果中会看到SmartPGP中配置的pkg/applet的aid
使用GPG测试一下
rem 使用gpg检查openpgp卡信息
gpg --card-status
rem 如果提示找不到卡片,可以先尝试将读卡器的usb线拔掉再插上试一下。有时读卡器可能因为被其他进程抢占而无法被gpg使用
rem 重新插拔后依然检测不到openpgp卡就要检查下上述过程是否存在问题
rem 修改一下默认pin。admin pin: 12345678,pin: 123456
gpg --edit-card