1

我有一个非常棘手的问题(至少对我而言),我目前正在编写一个小而简单的加密和解密程序,该程序与多字母替换一起使用。

这是加密功能:

static string Encr(string plainText, string key)
    {
        char[] chars = new char[plainText.Length];
        int h = 0;
        for (int i = 0; i < plainText.Length; i++)
        {
            if (h == key.Length)
                h = 0;
            int j = plainText[i] + key[h];
            chars[i] = (char)j;
            h++;
        }
        StreamWriter sw = new StreamWriter(FILE_NAME, false, Encoding.Unicode);
        for (int x = 0; x < plainText.Length; x++)
        {
            sw.Write(chars[x]);
        }
        sw.Close();
        return new string(chars);
    }

它工作正常,现在我的问题是 StreamWriter 创建的 outputFile 包含额外的不需要的 00(由于 Unicode 编码)和 2 个完全错误的起始值也由于 Unicode 编码

http://abload.de/img/unbenannt-16ilx4.jpg (对不起,我不能直接发布图片,因为我 < 10rep)

FF FE 8A 00 A6 00 CC 00 A4 00 B0 00

粗体是正确的,一开始的 FF FE 对我的加密/解密完全没用,并且 00 是不需要的(我知道这是标准的 Unicode 编码,我的问题是我如何在没有这种编码的情况下实现它但仍然能够显示相应的 Unicode 字符)

我希望很清楚我想要实现的目标,我只想写出字符。因此,在这种特殊情况下,加密文件的十六进制视图如下所示: 8A A6 CC A4 B0,根据http://unicode-table.com/编码为 Unicode UTF-8 ,因此对应的字母为Š ¦Ì¤°

到目前为止,我试图解决这个问题的所有尝试都失败了。解决方案可能真的很容易通过......

4

3 回答 3

1

有理由不使用Encoding.UTF8吗?

于 2013-08-23T22:14:51.413 回答
1

开头的字符是编码前导码的 2 个字节,用于标识所使用的编码。我认为您最好转换为字节并将字节写入通用二进制文件而无需任何编码。

如:

static string Encr(string plainText, string key)
{
    char[] chars = new char[plainText.Length];
    int h = 0;
    for (int i = 0; i < plainText.Length; i++)
    {
        if (h == key.Length)
            h = 0;
        int j = plainText[i] + key[h];
        chars[i] = (char)j;
        h++;
    }

    File.WriteAllBytes(FILE_NAME, System.Text.Encoding.UTF8.GetBytes(chars));

    return new String(chars, System.Text.Encoding.UTF8);
}
于 2013-08-23T22:16:55.053 回答
0

你所拥有的似乎正在工作,但它并没有真正起作用。当您加密了字符代码后,不再将它们视为字符代码,它们只是数值。大多数值将对应于某些字符,但不是全部。

加密的正确输出是 16 位整数数组,而不是字符串。然后,您可以根据需要将数字转换为某种文本表示形式,但不能将它们用作字符代码,并且在解密时可靠地得到相同的结果。

于 2013-08-23T22:42:41.483 回答