多重 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);
我在 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);