Encryption Java卡小程序在尝试加密消息时返回6f00

Encryption Java卡小程序在尝试加密消息时返回6f00,encryption,javacard,des,Encryption,Javacard,Des,我正在尝试加密卡中导入的密钥,并将其再次存储在同一字节数组中。 下面的import_key函数接收apdu并提取消息密钥,然后尝试对其进行加密(简单DES加密)并将其存储在同一位置。 似乎我已经做了所有必要的事情,但不幸的是,每次我取消对加密部分的注释时,我都会收到6f00!!! 这是我的代码: public class Encryptor extends Applet { private byte[] KEY = new by

我正在尝试加密卡中导入的密钥,并将其再次存储在同一字节数组中。 下面的import_key函数接收apdu并提取消息密钥,然后尝试对其进行加密(简单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;
    }
}
行中:

DESKey MyDES1Key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES,KeyBuilder.LENGTH_DES, false);
您将
MyDES1Key
的长度定义为
length\u DES
,即
8
字节,而在以下行中:

DESKey MyDES1Key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES,KeyBuilder.LENGTH_DES, false);
MyDES1Key.setKey(TheDES_键,(短)0)

您正在用
24
bytes变量填充它

换句话说,您必须将以下行中的
KeyBuilder.LENGTH\u DES
替换为
KeyBuilder.LENGTH\u DES3\u 3KEY

DESKey MyDES1Key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES,KeyBuilder.LENGTH_DES, false);
您将
MyDES1Key
的长度定义为
length\u DES
,即
8
字节,而在以下行中:

DESKey MyDES1Key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES,KeyBuilder.LENGTH_DES, false);
MyDES1Key.setKey(TheDES_键,(短)0)

您正在用
24
bytes变量填充它


换句话说,您必须将
KeyBuilder.LENGTH\u DES
替换为
KeyBuilder.LENGTH\u DES3\u 3KEY

@M.Jalali为什么定义
private byte key\u len=(byte)0
专用字节enc\u key\u len=(字节)0?为什么这些被赋值为零?
arrayCopy
方法不执行任何操作,因为这些值为length。这些方法包含在其他地方接收的KEY和ENC_KEY的长度。在
MyDES1Key.setKey(des_KEY,(short)0)行之前抛出异常
并抛出一个非
0x6D00
的特定值,然后运行程序以检查问题是在该行之前还是之后:)我找到了问题发生的位置,即在[MyCipher.doFinal(KEY,(short)0,(short)KEY_len,CipheredData,(short)0);]行中,但我不知道为什么会发生这种情况@贾拉里先生沃伊塔先生是对的。而且密钥长度必须小于
32
字节。因为
CipheredData
变量的长度是
32
字节。而且,如果您的算法模式是
NO\u PAD
@M.Jalali,那么
key\u length
必须除以8。为什么定义
private byte key\u len=(byte)0
专用字节enc\u key\u len=(字节)0?为什么这些被赋值为零?
arrayCopy
方法不执行任何操作,因为这些值为length。这些方法包含在其他地方接收的KEY和ENC_KEY的长度。在
MyDES1Key.setKey(des_KEY,(short)0)行之前抛出异常
并抛出一个非
0x6D00
的特定值,然后运行程序以检查问题是在该行之前还是之后:)我找到了问题发生的位置,即在[MyCipher.doFinal(KEY,(short)0,(short)KEY_len,CipheredData,(short)0);]行中,但我不知道为什么会发生这种情况@贾拉里先生沃伊塔先生是对的。而且密钥长度必须小于
32
字节。因为
CipheredData
变量的长度是
32
字节。而且,如果您的算法模式为
无键盘
键长
必须除以8,您的Lc是否大于127?如果是,
(short)key\u len
为负值,这可能会导致异常。试试
(short)(key\u len&0xFF)
,你会得到你想要的(短值128)。有什么进展吗?您的问题解决了吗?您的信用证是否大于127?如果是,
(short)key\u len
为负值,这可能会导致异常。试试
(short)(key\u len&0xFF)
,你会得到你想要的(短值128)。有什么进展吗?你的问题解决了吗?