多重 DES_CBC_NOPAD 加密的 doFinal 错误

Error in doFinal on multiple DES_CBC_NOPAD encryption

我在 Java 卡上使用 DES 加密时遇到问题:我在发送数据之前加密数据,然后将其作为对来自某个图书馆的请求的响应发送。

如果在一个小程序中 SELECT 发送信息请求,则通过卡上的 28-30 加密,会话失败并出现错误 6F00。之后所有加密调用return6F00。如果您再次选择小程序,问题就会消失。

加密前的所有数据,我都是8的倍数,所以由于消息长度的错误我马上排除了。可能是内存有问题,但是我每次发送数据后都调用JCSystem.requestObjectDeletion();

下面是我的Applet中实现的初始化和加密功能

public static void Init()
    rw_des_key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES3_3KEY, false);
    rw_cipherDes = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false);
    rw_des_key.setKey(rwdeskey, (short) 0);
}

public static short RWEncrypt(byte[] msg, short pos, short len, byte[] encMsg, short encPos) throws ArithmeticException, ArrayIndexOutOfBoundsException, ArrayStoreException, ClassCastException, IndexOutOfBoundsException, NegativeArraySizeException, NullPointerException, RuntimeException, SecurityException {
        rw_cipherDes.init(rw_des_key, Cipher.MODE_ENCRYPT);
        return rw_cipherDes.doFinal(msg, (short) pos, len, encMsg, (short) encPos);}

如果有人能告诉我可能是什么情况,那我将不胜感激!

我通过在 Cipher.getInstance 函数中将 externalAccess 标志从 False 更改为 True 来解决我的问题:

Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, true);

它解决了我的问题。

当对象中的外部访问(externalAccess)标志为假,但相应的对象被共享接口调用时,就会出现此问题。

例如(来自您的代码):-

rw_cipherDes = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false);

此处外部访问标志为 False,即您正在指示 Cipher API not 向任何外部应用程序提供密码对象的访问(这是为了通过共享接口调用此 API 的情况)。

因此,当通过可共享接口跨应用程序调用时,以下行将生成安全异常(因此为 SW 6F00)。

return rw_cipherDes.doFinal(msg, (short) pos, len, encMsg, (short) encPos);}

显然,当您从它自己的应用程序中调用同一个 API 时,它将正常工作。

解决方案允许对象 externalAccess (true)。这将使它可以通过共享界面访问。

rw_cipherDes = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, true);