JavaCard RSA密码DoFinal异常

时间:2017-03-09 10:14:26

标签: java encryption rsa javacard

我有这个代码用rsa加密数据:

private static RSAPrivateKey smartcard_rsa_private = (RSAPrivateKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PRIVATE, KeyBuilder.LENGTH_RSA_512, false);
private static RSAPublicKey smartcard_rsa_public = (RSAPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_512, false);
private static Cipher cipher = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false);

KeyPair kp = new KeyPair(smartcard_rsa_public,smartcard_rsa_private);
kp.genKeyPair();
smartcard_rsa_private=(RSAPrivateKey)kp.getPrivate();
smartcard_rsa_public=(RSAPublicKey)kp.getPublic();
byte[] buffer = apdu.getBuffer();
cipher.init(smartcard_rsa_public, Cipher.MODE_ENCRYPT);
cipher.doFinal(buffer, ISO7816.OFFSET_CDATA, (short) apdu.setIncomingAndReceive(), buffer, (short)0);

我发送以下APDU:

byte[] data = new byte [64];
new CommandAPDU(0x80, 0x01, 0x00, 0xff, data);

我得到一个错误代码5而doFinal应该是以下之一:

如果满足以下条件之一,则表示CryptoException.ILLEGAL_USE:

  • 此Cipher算法不填充消息,而消息不填充 块对齐。
  • 此Cipher算法不会填充消息,也不会 输入数据已在inBuff中或通过update()方法提供。
  • 不支持输入消息长度或消息值 大于或等于模数。
  • 解密数据不受适当填充字节的限制。

1 个答案:

答案 0 :(得分:2)

您的明文不是块对齐的,因为您的输入数据长度为64,但是具有512位公钥的单个RSA纯文本块的长度为53个字节。

对于n位RSA密钥,直接加密适用于最多n/8 - 11字节的任意二进制消息(提供n可被8整除,当然通常是这样)。

真正的问题是为什么在没有任何填充机制的情况下使用RSA进行加密。没有理由,真的。请改用ALG_RSA_PKCS1

如果您需要加密长数据,请使用AES对其进行加密,并将与RSA一起加密的AES密钥与消息一起共享。非对称密码学非常慢。