Java RSA加密

Java RSA加密,java,encryption,rsa,long-integer,Java,Encryption,Rsa,Long Integer,我试图前后编码一个简单的字符串“test” public static String encode(Key publicKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { byte[] byteData = data.getBytes(); // co

我试图前后编码一个简单的字符串“test”

public static String encode(Key publicKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

    byte[] byteData = data.getBytes(); // convert string to byte array

    Cipher cipher = Cipher.getInstance(ALGORITHM); // create conversion processing object
    cipher.init(Cipher.ENCRYPT_MODE, publicKey); // initialize object's mode and key

    byte[] encryptedByteData = cipher.doFinal(byteData); // use object for encryption

    return new String(encryptedByteData); // convert encrypted byte array to string and return it

}

public static String decode(Key privateKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

    byte[] byteData = data.getBytes(); // convert string to byte array

    Cipher cipher = Cipher.getInstance(ALGORITHM); // create conversion processing object
    cipher.init(Cipher.DECRYPT_MODE, privateKey); // initialize object's mode and key

    System.out.println(byteData.length);

    byte[] decryptedByteData = cipher.doFinal(byteData); // use object for decryption

    return new String(decryptedByteData); // convert decrypted byte array to string and return it

}
然而,尽管加密工作正常(算法为“RSA”),但在尝试解密我刚从加密“test”中获得的字符串时,我遇到以下异常:

javax.crypto.IllegalBlockSizeException:数据长度不得超过256字节

我应该将加密的字节分成256个字节才能解密吗?

来自:

RSA算法只能加密具有最大字节长度的数据 以位除以8减11填充的RSA密钥长度 字节,即最大字节数=密钥长度(位/8-11)。 如果要加密较大的数据,请使用较大的密钥,例如, 4096位的密钥将允许您加密501字节的数据


您无法可靠地将随机字节转换为
字符串
。结果将取决于运行此操作的计算机上默认的字符编码。使用许多编码,密码文本将被破坏,信息将丢失

修改代码,改为使用
字节[]
(doFinal()方法的结果)


如果需要将
字节[]
转换为字符串,请使用Base-64之类的编码。

如果数据较长,则应将其拆分为适合的数据块,并对每个数据块进行加密/解密(这不是一个好主意)或使用对称算法(AES/DES/RC4/等)对其进行加密/解密,使用RSA公钥加密对称密钥,并将两者发送到另一端。(更好的主意)


第二种方法是一种非常常见的方法,因为非对称加密算法比对称算法(加密和解密)要昂贵得多.

虽然我读过与谷歌搜索结果完全相同的句子,但将密钥设置得更高对我来说不起作用。我测试了加密的字节数组长度,注意到当密钥长度从2048提高到4096时,字节数组长度也变大了,在这两种情况下都不合适。啊,太好了,thanks,工作得很好!是的,我想当我将加密的字节数组转换为字符串时会出现问题。谢谢。当数据确实超出限制时,我会这样做,但这不是加密像“test”这样的简单字符串时的问题所在是的,我误解了你的问题,但我认为这对未来是个好建议。祝你好运!