JavaCard 小程序不适用于 RSA 加密
JavaCard applet is not working with RSA encryption
我正在开发一个 JavaCard 小程序。小程序在构造函数中生成 RSA public 和私钥,并使用 APDU 命令加密一些字节数组:
public RSATestApplet() {
keyPair = new KeyPair(KeyPair.ALG_RSA_CRT, KeyBuilder.LENGTH_RSA_2048);
keyPair.genKeyPair();
rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
cipher = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false);
register();
}
主要方法是:
private void encryptData(APDU apdu) {
if (!rsaPublicKey.isInitialized()) {
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
}
byte[] apduBuffer = apdu.getBuffer();
apdu.setIncomingAndReceive();
cipher.init(rsaPrivateKey, Cipher.MODE_ENCRYPT);
byte[] encryptedBuffer = new byte[apduBuffer.length];
Util.arrayFillNonAtomic(encryptedBuffer, (short) 0,
(short) encryptedBuffer.length, (byte) 0xAA);
cipher.doFinal(encryptedBuffer, (short) 0, (short) encryptedBuffer.length, apduBuffer, (short) 0);
// Just for testing send 120 bytes
apdu.setOutgoingAndSend((short) 0, (short) 120);
}
当我尝试安装小程序时,APDU 响应是 6E00(这意味着:没有精确诊断)。
我认为 cipher.doFinal() 执行时可能会出现问题。
我试过其他小程序,一切正常。
我用 JavaCard 2.2.1 和 Java 1.2
编译我的小程序
你知道发生了什么事吗?
我坚信您在安装小程序过程中遇到的错误与您的 encryptData 方法无关。
我建议您在构造函数中使用 try catch 来捕获 JCVM 抛出的异常。例如,当您创建 KeyPair 对象时,如果平台不支持算法和密钥长度,它可能会抛出错误。
您可以尝试这样的操作:
try {
keyPair = new KeyPair(KeyPair.ALG_RSA, KeyBuilder.LENGTH_RSA_2048);
} catch (CryptoException e) {
short reason = e.getReason();
ISOException.throwIt(reason);
}
我正在开发一个 JavaCard 小程序。小程序在构造函数中生成 RSA public 和私钥,并使用 APDU 命令加密一些字节数组:
public RSATestApplet() {
keyPair = new KeyPair(KeyPair.ALG_RSA_CRT, KeyBuilder.LENGTH_RSA_2048);
keyPair.genKeyPair();
rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
cipher = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false);
register();
}
主要方法是:
private void encryptData(APDU apdu) {
if (!rsaPublicKey.isInitialized()) {
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
}
byte[] apduBuffer = apdu.getBuffer();
apdu.setIncomingAndReceive();
cipher.init(rsaPrivateKey, Cipher.MODE_ENCRYPT);
byte[] encryptedBuffer = new byte[apduBuffer.length];
Util.arrayFillNonAtomic(encryptedBuffer, (short) 0,
(short) encryptedBuffer.length, (byte) 0xAA);
cipher.doFinal(encryptedBuffer, (short) 0, (short) encryptedBuffer.length, apduBuffer, (short) 0);
// Just for testing send 120 bytes
apdu.setOutgoingAndSend((short) 0, (short) 120);
}
当我尝试安装小程序时,APDU 响应是 6E00(这意味着:没有精确诊断)。
我认为 cipher.doFinal() 执行时可能会出现问题。
我试过其他小程序,一切正常。
我用 JavaCard 2.2.1 和 Java 1.2
编译我的小程序你知道发生了什么事吗?
我坚信您在安装小程序过程中遇到的错误与您的 encryptData 方法无关。
我建议您在构造函数中使用 try catch 来捕获 JCVM 抛出的异常。例如,当您创建 KeyPair 对象时,如果平台不支持算法和密钥长度,它可能会抛出错误。
您可以尝试这样的操作:
try {
keyPair = new KeyPair(KeyPair.ALG_RSA, KeyBuilder.LENGTH_RSA_2048);
} catch (CryptoException e) {
short reason = e.getReason();
ISOException.throwIt(reason);
}