我正在尝试使用支持 MD5 的 Java Card 散列一条 8 字节的消息(可能需要将其放大到 128)。这是我的源代码:
package net.sourceforge.globalplatform.jc.helloworld;
import javacard.framework.*;
import javacard.security.*;
import javacardx.crypto.Cipher;
import javax.print.attribute.standard.MediaSize;
import java.util.logging.Level;
public class HelloWorldApplet extends Applet {
final static byte APPLET_CLA = (byte)0x80;
final static byte HASH = (byte)0x05;
public static byte[] Message;
MessageDigest mDig = MessageDigest.getInstance(MessageDigest.ALG_MD5, true);
public static void install(byte[] bArray, short bOffset, byte bLength)
{
Message = new byte[256];
new HelloWorldApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buffer = apdu.getBuffer();
if (buffer[ISO7816.OFFSET_CLA] == APPLET_CLA) {
switch (buffer[ISO7816.OFFSET_INS]) {
case HASH:
hash_message(apdu);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
} else {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
}
public void hash_message(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short mLen = apdu.setIncomingAndReceive();
mDig.reset();
mDig.doFinal(buffer, (short) ISO7816.OFFSET_CDATA, mLen, Message, (short) 0);
Util.arrayCopy(Message,(short)0,buffer,(short)0, mLen);
apdu.setOutgoingAndSend((short)0,mLen);
}
}
这也是我使用 GPSShell 进行的测试:
send_apdu -sc 1 -APDU 80050000081122334455667788
Command --> 80050000081122334455667788
Wrapped command --> 80050000081122334455667788
Response <-- DD254CDC958E53AB9000
send_APDU() returns 0x80209000 (9000: Success. No error.)
我有不同的问题:
我使用此链接在 MD5 哈希上测试了我的数据,但发现它无法正常工作!我不知道为什么当我使用尽可能简单的代码时这个算法没有正确响应!谁能告诉我这个问题?
有没有办法向卡发送/接收 256 字节的数据?
GPSShell 有什么更好的替代品?
更新 1:我已经看到了这个链接,但它并没有解决我的问题。
更新 2:对问题 1 的回答返回 GPSShell 和在线计算器中的 Hex 和 ASCII 数据差异。