JavaCard RSA密码最终异常
我有以下代码可以使用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
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开销和获得正确的块链接)