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_PADkey_length 必须可以被 8 整除

以上是关于Java Card Applet 在尝试加密消息时返回 6f00的主要内容,如果未能解决你的问题,请参考以下文章

JAVA card 应用开发 JCOP的调试方法

尽管运行代码显示菜单,但Java applet显示白屏

Java applet RuntimeException:java.lang.NoClassDefFoundError:javax / mail / Authenticator

获取缓冲区内容与将缓冲区内容返回—Java card开发第一篇

在尝试连接到applet进行调试时,'shmemBase_attach失败:系统无法找到指定的文件'

Java Card setExponent() 方法在指数超过 10 个字节时失败