基于SmartPGP低成本DIY OpenPGP卡(YubiKey替代品)


简单介绍一下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左右

软件准备

制作流程

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

文章作者: 2356
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 2356 !