我是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這樣的適度的系統會很快地消滅這些例子(然後再說,你不應該把例子發佈在藍色之外)。 –