我试图来回编码一个简单的String“ 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 }
但是,尽管加密工作得很好(ALGORITHM是“ RSA”),但是当尝试解密刚刚从加密“ test”中获得的字符串时,出现以下异常:
javax.crypto.IllegalBlockSizeException:数据不得超过256个字节
我是否应该将加密的字节分成256个块才能解密?
您无法可靠地将随机字节转换为String。结果将取决于运行此字符的计算机上的默认字符编码。使用许多编码,密文将被破坏,并且信息将丢失。
String
修改您的代码以使用byte[]代替(doFinal()方法的结果。
byte[]
如果需要将转换为byte[]字符串,请使用类似Base-64的编码。