bytes in 'str = new String(bytes, “UTF8”) ' and 'bytes = str.getBytes(“UTF8”)' not the same value

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-09 00:19:24

问题


I can see they are different than the bytes I created the string with! I have used "AES/CBC/PKCS5Padding" to get the string.

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"));
    }
}

回答1:


When you decode a string as UTF-8 it is because you encoded the bytes as UTF-8 or something compatible. You can't just take a byte[] of random bytes and turn it into a String because it is binary data not text.

What you can do is use a Base64 encoder for the binary and a Base64 decoder to turn it back into the original bytes.

A hacky way of doing this is to use ISO-8859-1, but this is a bad idea generally as you are confusing binary and text data.



来源:https://stackoverflow.com/questions/32069063/bytes-in-str-new-stringbytes-utf8-and-bytes-str-getbytesutf8-n

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!