Encryption doFinal在多个DES_CBC_NOPAD加密上出错

Encryption doFinal在多个DES_CBC_NOPAD加密上出错,encryption,javacard,des,Encryption,Javacard,Des,我对Java卡上的DES加密有一个问题:我在发送数据之前对数据进行加密,然后将其作为对来自某个库的请求的响应发送 如果在一个小程序中SELECT发送信息请求,则通过卡上的28-30次加密,会话将出现错误6F00。之后,所有加密调用都返回6F00。如果再次选择小程序,问题就会消失 所有数据加密前,我做了8的倍数,所以由于消息长度的错误我马上消除了。可能存在内存问题,但我调用JCSystem.requestObjectDelete()每次发送数据后 下面是在我的小程序中实现的初始化和加密功能 pub

我对Java卡上的DES加密有一个问题:我在发送数据之前对数据进行加密,然后将其作为对来自某个库的请求的响应发送

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

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

下面是在我的小程序中实现的初始化和加密功能

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);}

如果有人能说出可能的情况,我将非常感激

我通过在密码中将外部访问标志从False更改为True来修复我的问题。getInstance函数:

Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, true);

无法解决我的问题。

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

例如(从代码中):-

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

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

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

返回rw_cipherDes.doFinal(消息,(短)位置,len,encMsg(短) encPos);}

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

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

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


这不是答案。你有什么解释为什么这样有帮助吗?如果我是你,我会删除这个答案并等待真正的解释…调用
requestobjectdeletation
并不能完全避免资源泄漏:如果保留引用,那么这些资源将不会被释放。请注意,对象删除可能仅在启动时执行,并且可能需要大量时间-您希望在发卡后不惜一切代价避免这种情况。顺便说一下,您可以使用反勾号来标记内联代码,也可以通过在标记编辑器中创建白线来引入节(或者使用双空格,enter在同一节中引入新行)。