通常,当我们编写包含我们的卡不支持的功能的applet时,卡上验证程序会阻止安装其CAP文件。
我想知道是否有任何方法可以编写可以安装在所有卡上的applet,但是在运行时为那些不支持该方法调用的某个功能的卡返回已经定义的错误。
更清楚,假设我们知道所有卡都支持DES加密算法,而一些卡也支持AES作为补充算法。现在我想编写一个小程序,如果该算法可用,则使用AES算法加密8字节数据;如果AES不可用,则使用DES算法。我能这样做吗?
问题是我认为我无法在不支持AES的卡上安装我的applet。
答案 0 :(得分:4)
我认为你混合了两个问题:
<强> 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()
方法的输出)。这就是您的applet可以轻松决定该卡是否支持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。库强>
另一个无法轻易解决的问题是库依赖性。如果您的applet需要使用某些专有类(例如恩智浦卡支持的com.nxp.id.jcopx.UtilX
),则无法在没有特定库的卡上安装它。唯一的方法是将有问题的代码拆分为两个包,并根据卡上已存在的包确定要上传的包。