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);
}