‘str = new String(bytes,“UTF8”)’和’bytes = str.getBytes(“UTF8”)’中的字节值不一样

我可以看到它们与我创建字符串的字节不同! 我用“AES / CBC / PKCS5Padding”来获取字符串。

public static void main(String[] args) { try { int randomNumber = CNStationQueueUtil.randInt(0, 99999); String key = "AES_KEY_TAKENUMB"; byte[] bytes = EncryptHelper.encrypt(key, String.format("%%%d%%%d", 1001, randomNumber)); String str = new String(bytes, "UTF8"); System.out.println("str = " + str); System.out.println(); byte[] utf8Bytes = str.getBytes("UTF8"); printBytes(utf8Bytes, "utf8Bytes"); } catch (Exception e) { e.printStackTrace(); } } public class EncryptHelper { public static byte[] encrypt(String key, String value) throws GeneralSecurityException { byte[] raw = key.getBytes(Charset.forName("UTF-8")); if (raw.length != 16) { throw new IllegalArgumentException("Invalid key size."); } SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16])); return cipher.doFinal(value.getBytes(Charset.forName("UTF-8"))); } public static String decrypt(String key, byte[] encrypted) throws GeneralSecurityException { byte[] raw = key.getBytes(Charset.forName("UTF-8")); if (raw.length != 16) { throw new IllegalArgumentException("Invalid key size."); } SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16])); byte[] original = cipher.doFinal(encrypted); return new String(original, Charset.forName("UTF-8")); } } 

当您将字符串解码为UTF-8这是因为您将字节编码为UTF-8或兼容的东西。 你不能只取一个随机字节的byte[]并把它变成一个String,因为它是二进制数据而不是文本。

您可以做的是使用Base64编码器作为二进制文件,使用Base64解码器将其转换回原始字节。

一个hacky这样做的方法是使用ISO-8859-1 ,但这通常是一个坏主意,因为你混淆二进制和文本数据。