2

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

加密类完美无缺,但我在 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_dataIOUtils.toString(encode_data, "UTF-8").getBytes("UTF-8")进行了比较,由于某种原因,它们完全是不同的数组。难怪我的解密算法失败了。

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

4

2 回答 2

4

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

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

于 2013-05-16T16:11:48.797 回答
0

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

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

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

于 2013-05-16T15:37:08.047 回答