JavaCard RSA密码最终异常

JavaCard RSA密码最终异常,java,encryption,rsa,javacard,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.b

我有以下代码可以使用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);
当doFinal运行时,我得到一个错误代码5,它应该是以下之一:

CryptoException.unligal\u如果满足以下条件之一,则使用:

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

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

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

真正的问题是为什么使用RSA进行加密而根本没有任何填充机制。没有理由,真的。改用
ALG\u RSA\u PKCS1


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

您能告诉我们您发送的APDU吗?这看起来像是填充问题。@vojta我更新了这个问题,速度太慢可能是最不重要的原因,为什么您只想使用RSA加密随机密钥进行对称加密,而不是加密实际数据…@MichaelRoland如果您有任何想法,请改进我的答案。我认为速度是最重要的原因。。。您还知道哪些其他原因?请参阅例如(TL;密文大小中的DR开销和获得正确的块链接)