1

我正在使用 UTF8 转换加密文本,但生成的字符串包含我无法阅读的有趣字符,并且不确定是否可以将此文本发送到浏览器。

        string message = "hello world";
        var rsa = new RSACryptoServiceProvider(2048);

        var c = new UTF8Encoding();

        byte[] dataToEncrypt = c.GetBytes(message);
        byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);

        string output = c.GetString(encryptedData);

        Console.WriteLine(output);
        Console.ReadLine();

当我运行上述内容时,我得到以下信息:

�VJI����J/;�&gt;�:<�M����g�1�7�A.@�`J�s��~��)�Fn�����5�.���o���ҵ���jH3;G�&lt;<��F�͗��~?�Y�#���j���6l{{�Y�$�]���nylz���X8u�\f�V1/�$�n+�\b��\b�fsAh՝G\n�\t���\b���6߇3����Ԕ���4��@هhI���'\0� T�n��|EϺ^7ú l��T\\!�w���QRWA%p��V\f��5�

我需要将此文本发送回浏览器,或将其保存到文件中,目前我不确定为什么会收到这些字符?

4

3 回答 3

6

问题是您正在获取不是通过编码文本创建的字节数组,并像使用它一样使用它。您只能解码通过编码创建的数据,如果您解码任意数据,您最终会得到垃圾。

如果您希望将加密生成的二进制数据作为字符串,例如使用 base64 编码:

string output = Convert.ToBase64String(encryptedData);

当您要解密数据时,使用Convert.FromBase64String来取回字节数组,对其进行解密,然后Encoding.UTF8.GetString将其转回原始字符串。在那里它将对数据进行解码,因为它是通过从一开始就对字符串进行编码而创建的。

于 2013-06-05T21:30:26.600 回答
3

这两行假装 RSA 加密的 UTF-8 序列的输出是有效的 UTF-8 序列:

    var c = new UTF8Encoding();
    string output = c.GetString(encryptedData);

但事实并非如此:RSA 加密将字节值映射到其他(看似)任意字节值。生成的字节序列不会形成有效的 UTF-8 序列(没有理由假设它会),因此不能被视为一个。

如果您只想要数据的可读(或 HTTP 可发送)表示,那么 Base64 是要走的路,如其他答案所示。不过,从根本上讲,您可能应该阅读 Joel 的文章,关于每个软件开发人员绝对、肯定必须了解 Unicode 和字符集(没有借口!)的绝对最小值

于 2013-06-05T21:32:54.533 回答
2

加密字符串将产生一个包含不可打印字符的字节数组。您需要将其转换为 base64 以获得它的可读版本。

于 2013-06-05T21:29:39.103 回答