Java Card Applet 在尝试加密消息时返回 6f00
Posted
技术标签:
【中文标题】Java Card Applet 在尝试加密消息时返回 6f00【英文标题】:Java Card Applet returns 6f00 while trying to encrypt a message 【发布时间】:2015-12-16 08:49:09 【问题描述】:我正在尝试加密我卡中导入的密钥并将其再次存储在同一个字节数组中。 下面的 import_key 函数接收一个 apdu 并提取消息 KEY,然后尝试对其进行加密(简单 DES 加密)并将其存储在同一位置。 似乎我已经做了所有必要的事情,但不幸的是,每次我取消加密部分的注释时我都会收到 6f00 !!! 这是我的代码:
public class Encryptor extends Applet
private byte[] KEY = new byte[128];
private byte key_len = (byte)0;
private byte[] ENC_KEY = new byte[32];
private byte enc_key_len = (byte)0;
Cipher MyCipher;
private byte[] TheDES_Key = new byte[24];
DESKey MyDES1Key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES,KeyBuilder.LENGTH_DES, false);
byte ConfiguredKeyLength = 0;
...
private void import_key(APDU apdu)
byte[] buffer = new byte[maximum_buffer_len];
buffer = apdu.getBuffer();
key_len = buffer[ISO7816.OFFSET_LC];
apdu.setIncomingAndReceive();
Util.arrayCopy(buffer, (short) (ISO7816.OFFSET_CDATA), KEY, (short) 0, (short) key_len);
Util.arrayCopyNonAtomic(ENC_KEY, (short) 0, TheDES_Key, (short) 0, (short) enc_key_len);
MyDES1Key.setKey(TheDES_Key, (short) 0);
MyCipher.init(MyDES1Key, Cipher.MODE_ENCRYPT);
byte[] CipheredData = JCSystem.makeTransientByteArray((short) 32,JCSystem.CLEAR_ON_DESELECT);
MyCipher.doFinal(KEY, (short)0,(short)key_len,CipheredData,(short)0);
Util.arrayCopyNonAtomic(CipheredData,(short)0,KEY,(short)0,(short)key_len);
return;
【问题讨论】:
你的 Lc 是否大于 127?如果是,(short) key_len
为负值,可能会导致异常。试试(short) (key_len & 0xFF)
,你会得到你想要的(短值128)。
有什么进展吗?你的问题解决了吗?
【参考方案1】:
行内:
DESKey MyDES1Key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES,KeyBuilder.LENGTH_DES, false);
您将MyDES1Key
的长度定义为LENGTH_DES
,即8
字节,而在该行中:
MyDES1Key.setKey(TheDES_Key, (short) 0);
您正在用 24
字节变量填充它!
换句话说,您必须将KeyBuilder.LENGTH_DES
替换为KeyBuilder.LENGTH_DES3_3KEY
。
【讨论】:
@M.Jalali 为什么定义private byte key_len = (byte)0;
和private byte enc_key_len = (byte)0;
?为什么那些被分配为零? arrayCopy
方法什么都不做,因为这些值为长度。
那些包含在其他地方收到的KEY和ENC_KEY的长度。
在MyDES1Key.setKey(TheDES_Key, (short) 0);
行之前抛出异常并抛出0x6D00
以外的特定值,然后运行程序检查问题是在该行之前还是之后:)
我找到了问题所在,即在 [MyCipher.doFinal(KEY, (short)0,(short)key_len,CipheredData,(short)0);] 行中,但我不知道为什么会这样!
@M.Jalali Mr.Vojta 是对的。而且 key_length 必须短于 32
字节。因为CipheredData
变量的长度是32
字节。此外,如果您的算法模式为NO_PAD
,key_length
必须可以被 8 整除以上是关于Java Card Applet 在尝试加密消息时返回 6f00的主要内容,如果未能解决你的问题,请参考以下文章
Java applet RuntimeException:java.lang.NoClassDefFoundError:javax / mail / Authenticator
获取缓冲区内容与将缓冲区内容返回—Java card开发第一篇