【问题标题】:bytes in 'str = new String(bytes, "UTF8") ' and 'bytes = str.getBytes("UTF8")' not the same value'str = new String(bytes, "UTF8")' 和 'bytes = str.getBytes("UTF8")' 中的字节值不同
【发布时间】:2015-08-18 09:50:46
【问题描述】:

我可以看到它们与我创建字符串时使用的字节不同! 我已经使用“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"));
    }
}

【问题讨论】:

  • 你能分享一个完整的例子吗?
  • 您如何比较 strbytes?它们应该不同,因为一个包含char,另一个包含byte
  • 尝试“UTF-8”而不是“UTF8”

标签: java string utf-8 bytearray aes


【解决方案1】:

当您将字符串解码为 UTF-8 时,这是因为您将字节编码为 UTF-8 或兼容的格式。您不能只取byte[] 的随机字节并将其转换为字符串,因为它是二进制数据而不是文本。

您可以对二进制文件使用 Base64 编码器并使用 Base64 解码器将其转回原始字节。

使用ISO-8859-1 是一种很老套的方法,但通常这是一个坏主意,因为您会混淆二进制数据和文本数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多