Encryption 在java卡中使用CBC DES加密

Encryption 在java卡中使用CBC DES加密,encryption,javacard,3des,cbc-mode,Encryption,Javacard,3des,Cbc Mode,我正在尝试使用Cipher类加密数据。我想指定初始向量,因此我使用以下函数: try { cipherCBC = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false); cipherCBC.init(k, Cipher.MODE_ENCRYPT,INITVECTOR,(short)0,(short)8); cipherCBC.doFinal(data, (short) 0, (short) data.length, res

我正在尝试使用Cipher类加密数据。我想指定初始向量,因此我使用以下函数:

try {
    cipherCBC = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false);
    cipherCBC.init(k, Cipher.MODE_ENCRYPT,INITVECTOR,(short)0,(short)8);
    cipherCBC.doFinal(data, (short) 0, (short) data.length, result, (short) 0);
} catch (Exception e) {
    ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
}
使用8字节数组初始化的字节数组INITVECTOR

问题是,当我使用init函数时,总是会捕获异常

额外信息:

关键是在这里构建:

octetsLus = (byte) (apdu.setIncomingAndReceive());
if (octetsLus != 16) {
    ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
}    

// build host crypto 
Util.arrayCopy(buffer, (short)(ISO7816.OFFSET_CDATA+4),  message, (short) 0,(short) 4);
Util.arrayCopy(buffer, (short)(ISO7816.OFFSET_CDATA+8),  message, (short) 4,(short) 4);
Util.arrayCopy(buffer, (short)(ISO7816.OFFSET_CDATA),    message, (short) 8,(short) 4);
Util.arrayCopy(buffer, (short)(ISO7816.OFFSET_CDATA+12), message, (short) 12,(short) 4);

// GENERATE SESSION KEYS 
encrypt_DES(ENC_key, message,(byte) 0x01);
Util.arrayCopy(result,(short) 0, ENC_SESS_KEY, (short) 0,(short) 16);

encrypt_DES(MAC_key, message,(byte) 0x01);
Util.arrayCopy(result,(short) 0, MAC_SESS_KEY, (short) 0,(short) 16);

ENC_key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES3_2KEY, false);
ENC_key.setKey(ENC_SESS_KEY, (short) 0);

MAC_key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES3_2KEY, false);
MAC_key.setKey(MAC_SESS_KEY, (short) 0);


 Util.arrayCopy(buffer, (short)(ISO7816.OFFSET_CDATA), message, (short) 0,(short) 8); 
 Util.arrayCopy(buffer, (short)(ISO7816.OFFSET_CDATA+8), message, (short) 8,(short) 8);

   for(i=0;i<8;i++)
     message[(short)(16+i)]=(byte)PADDING[i];
另一方面,当我使用使用默认初始化参数的init函数时,加密函数工作良好:

cipherCBC.init(k, Cipher.MODE_ENCRYPT);

您可以发布异常(完整堆栈跟踪)吗?还有INITVECTOR的实际初始化。您应该添加更多的代码,尤其是那些初始化key和iv的部分。@jjmontes这是Java卡,不是Java卡。您可以访问的唯一信息是异常的类型及其原因(方法的输出)。这就是OP应该添加的内容。没关系,我发现了问题,我发现数据的长度不正确,谢谢@vojta的帮助!请发布您自己的答案并标记为解决方案。
cipherCBC.init(k, Cipher.MODE_ENCRYPT);