在JAVA中加密Base64 + XOR + UTF8,在C#中解密

时间:2012-11-05 16:04:42

标签: c# java base64

我有简单的加密函数,它接受字符串,将其转换为字节,xor并应用base64。

JAVA:

String key = "1234";
public String encrypt(String plainText) throws Exception {

    byte [] input = plainText.getBytes("UTF8");
    byte [] output = new byte[input.length];
    for(int i=0; i<input.length; i++)
        output[i] = ((byte)(input[i] ^ key.charAt(i % key.length())));

    String utf8 = new String(output);
    return Utils.encode(utf8); 
}

然后我将它保存到一个文件中并使用这种解密方法在C#中的另一个应用程序中打开它:

C#:

string key="1234";
public string Decrypt(string CipherText)
{
    var decoded = System.Convert.FromBase64String(CipherText);
    var dexored = xor(decoded, key);
    return Encoding.UTF8.GetString(dexored);
}

byte[] xor(byte[] text, string key)
{
    byte[] res = new byte[text.Length];

    for (int c = 0; c < text.Length; c++)
    {
        res[c] = (byte)((uint)text[c] ^ (uint)key[c % key.Length]);
    }

    return res;
}

问题是像šščřžýáí这样的重音字符无法解码。

您是否知道如何确定问题来自哪个部分或如何找到问题?在我看来它与UTF-8有关。

我不需要更好的加密建议。我已经使用AES了,但由于性能问题,我想切换到xored base64。

谢谢。

1 个答案:

答案 0 :(得分:2)

这是问题所在:

String utf8 = new String(output);
return Utils.encode(utf8); 

你应该在output上使用base64,而不是用现在不是真正的文本数据构建一个字符串。由于某种原因,Utils.encode执行base64编码可能会将输入字符串转换回 - 但从根本上说,您不应该使用{{1来构造带有加密字节的字符串构造函数。

如果您的String类有一个Utils方法 - 如果真的 <64>对数据进行base64编码(那么只有一半的代码是非常令人沮丧的)然后你可以使用:

encode(byte[])