'str = new String(bytes, "UTF8") ' 和 'bytes = str.getBytes("UTF8")' 中的字节值不同
bytes in 'str = new String(bytes, "UTF8") ' and 'bytes = str.getBytes("UTF8")' not the same value
我可以看到它们与我创建字符串时使用的字节不同!
我已经使用 "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[]
个随机字节并将其转换为字符串,因为它是二进制数据而不是文本。
您可以对二进制文件使用 Base64 编码器,并使用 Base64 解码器将其转换回原始字节。
执行此操作的一种 hacky 方法是使用 ISO-8859-1
,但这通常不是一个好主意,因为您会混淆二进制数据和文本数据。
我可以看到它们与我创建字符串时使用的字节不同! 我已经使用 "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[]
个随机字节并将其转换为字符串,因为它是二进制数据而不是文本。
您可以对二进制文件使用 Base64 编码器,并使用 Base64 解码器将其转换回原始字节。
执行此操作的一种 hacky 方法是使用 ISO-8859-1
,但这通常不是一个好主意,因为您会混淆二进制数据和文本数据。