我是Java Card的整个主题的新手,并试图查看一些代码示例以获得更好的理解。 我发现在oracle forum AES使用一个样本,但有以下部分的几个问题:Java Card中的En-/Decryption输出+相应的APDU
private void doAES(APDU apdu)
{
byte b[] = apdu.getBuffer();
short incomingLength = (short) (apdu.setIncomingAndReceive());
if (incomingLength != 24) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
//perform encryption and append results in APDU Buffer a[] automatically
cipherAES.init(aesKey, Cipher.MODE_ENCRYPT);
cipherAES.doFinal(b, (short) dataOffset, incomingLength, a, (short) (dataOffset + 24));
cipherAES.init(aesKey, Cipher.MODE_DECRYPT);
cipherAES.doFinal(b, (short) (dataOffset + 24), incomingLength, a, (short) (dataOffset + 48));
// Send results
apdu.setOutgoing();
apdu.setOutgoingLength((short) 72);
apdu.sendBytesLong(b, (short) dataOffset, (short) 72);
}
从我的理解这个代码利用从传入APDU第24个数据字节,对它们进行加密,并将它们放入字节数组a。 然后它需要接下来的24个数据字节,解密它们并将它们放入一个。
但下面的命令不会因为
使用这些输出数据apdu.sendBytesLong(b, (short) dataOffset, (short) 72);
采用B的输出数据......这可能是不正确的,所以请帮助我理解我哪里错了。
另外:一个简单的命令APDU用于加密一个小文本和相应的答案是什么样的?
这个例子只是伤了我的眼睛。请不要使用它。在Java **级别有非常基本的错误。缓冲区处理完全关闭。它当然应该从'a'而不是'b'解密,然后发送'a'。变量'a'应该是短暂的,只有在需要时才可以填写密钥的内容。就我个人而言,我不太喜欢太阳论坛,像SO这样的适度的系统会很快地消灭这些例子(然后再说,你不应该把例子发布在蓝色之外)。 –