从字符串编码和解码UTF-8字节数组

时间:2013-05-16 15:32:23

标签: java encoding utf-8

我正在研究跨平台加密系统。其中一个要求是在应用程序代码中轻松加密和解密字符串。

加密类运行完美,但我在java端遇到字符串编码问题。

目前,我有以下静态方法:

public static String encrypt(String key, String data)
{
    byte[] decoded_key;
    byte[] decoded_data;
    try
    {
        decoded_key = key.getBytes("UTF-8");
        decoded_data = data.getBytes("UTF-8");
    }
    catch (Exception e)
    {
        //Not Supposed to happen.
        throw new RuntimeException();
    }

    if(decoded_key.length != 16) 
        throw new IllegalArgumentException("Key length must be of 16 bytes. Given is " + decoded_key.length + ".");

    try
    {
        return(IOUtils.toString(encrypt(decoded_key, decoded_data), "UTF-8"));
    }
    catch (Exception e)
    {
        //Not Supposed to happen.
        throw new RuntimeException();
    }
}

public static String decrypt(String key, String data)
{
    byte[] decoded_key;
    byte[] decoded_data;
    try
    {
        decoded_key = key.getBytes("UTF-8");
        decoded_data = data.getBytes("UTF-8");
    }
    catch (Exception e)
    {
        //Not Supposed to happen.
        throw new RuntimeException();
    }

    if(decoded_key.length != 16) 
        throw new IllegalArgumentException("Key length must be of 16 bytes. Given is " + decoded_key.length + ".");

    try
    {
        return(IOUtils.toString(decrypt(decoded_key, decoded_data), "UTF-8"));
    }
    catch (Exception e)
    {
        //Not Supposed to happen.
        throw new RuntimeException();
    }
}

我的单元测试在解密时失败。我运行了一个测试,我将编码的UTF-8数据encoded_data的字节数组与IOUtils.toString( encoded_data , "UTF-8").getBytes("UTF-8")进行了比较,但出于某种原因,它们完全是不同的数组。难怪我的解密算法失败了。

从java字符串转换为UTF-8字节数组并返回java字符串的正确步骤是什么?

2 个答案:

答案 0 :(得分:4)

问题是您将加密数据转换为字符串。加密数据是二进制,而不是字符串数据。 UTF-8是具有特定编码格式的字符集。任意二进制数据有效的UTF-8数据。当您将加密数据转换为String时,“无效”字符很可能会被?无效字符替换。

如果要将任意二进制数据(也称为加密数据)转换为字符串,则需要使用像Base64这样的二进制>文本转换。

答案 1 :(得分:0)

我会首先尝试检查加密方法的输出是否与单元测试所期望的输出相匹配。

加密后使用Base64也是一个好主意,因此您可以将其转换为字符串。

另一个常见问题是将int转换为字节,就像它们是无符号整数一样。字节范围是-128到127.