如何写一个跨卡片Java卡片的小程序?

How to write a cross-card Java Card applet?

通常情况下,当我们编写包含我们的卡不支持的功能的小程序时,卡上验证程序会阻止安装其 CAP 文件。

我想知道是否有任何方法可以编写一个可以安装在所有卡上的小程序,但是 returns 在 运行 时间内对于那些不支持这些卡的已经定义的错误它在该方法调用上的功能。

更清楚,假设我们知道所有的卡都支持DES加密算法并且一些卡还支持AES作为辅助算法。现在我想编写一个小程序,如果该算法可用,则使用 AES 算法加密 8 字节数据,如果 AES 不可用,则使用 DES 算法。我可以这样做吗?

问题是我想我无法在那些不支持 AES 的卡上安装我的小程序。

我认为你混淆了两个问题:

1.算法支持

您可以轻松地将使用 AES 的小程序安装到没有 AES 的卡上。缺少 AES 会在您尝试创建加密对象实例时导致运行时异常:

Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false);

KeyBuilder.buildKey(KeyBuilder.TYPE_AES, KeyBuilder.LENGTH_AES_128);

等等...请注意,异常是 CryptoException 的一个实例,其中 CryptoException.NO_SUCH_ALGORITHM 作为原因代码(getReason() 方法的输出)。这就是您的小程序可以轻松确定卡是否支持 AES 的方式。您可以在安装期间用 try-catch 围绕上面的行之一,并在必要时降级到更基本的算法:

Cipher cipher = null;
try {
  //trying AES
  cipher = Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false);
} catch (CryptoException e) {
   if (e.getReason() == CryptoException.NO_SUCH_ALGORITHM) {
       //AES missing, so trying DES instead
       cipher = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false);
   }
}

您可以对哈希函数、签名等使用类似的方法。

2。图书馆

另一个不容易解决的问题是库依赖。如果您的小程序需要使用某些专有的 class(例如 NXP 卡支持的 com.nxp.id.jcopx.UtilX),您将无法在没有特定库的情况下将其安装到卡上。你唯一的办法就是把有问题的代码分成两个包,然后根据卡上已经存在的包来决定上传哪个包。