我有这个代码用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:
答案 0 :(得分:2)
您的明文不是块对齐的,因为您的输入数据长度为64
,但是具有512位公钥的单个RSA纯文本块的长度为53
个字节。
对于n位RSA密钥,直接加密适用于最多n/8 - 11
字节的任意二进制消息(提供n
可被8整除,当然通常是这样)。
真正的问题是为什么在没有任何填充机制的情况下使用RSA进行加密。没有理由,真的。请改用ALG_RSA_PKCS1
。
如果您需要加密长数据,请使用AES对其进行加密,并将与RSA一起加密的AES密钥与消息一起共享。非对称密码学非常慢。