为什么这个加密的字符串里面有奇怪的字符?不太好读

本文关键字:字符 加密 字符串 为什么 | 更新日期: 2023-09-27 18:17:01

我正在使用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/;�>�:<�M����g�1�7�A.@�`J�s��~��)�Fn�����5�.���o���ҵ���jH3;G�<<��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�

我需要将此文本发送回浏览器,或将其保存到一个文件,目前我不知道为什么我得到这些字符?

为什么这个加密的字符串里面有奇怪的字符?不太好读

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

如果希望加密产生的二进制数据为字符串,则使用base64编码:

string output = Convert.ToBase64String(encryptedData);

当您想解密数据时,使用Convert.FromBase64String获取字节数组,解密它,并使用Encoding.UTF8.GetString将其转换回原始字符串。在这里,它可以解码数据,因为它是通过从头开始编码字符串创建的。

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

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

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

如果您只想要数据的可读(或HTTP可发送)表示,那么Base64是可行的方法,如其他答案所示。不过,从根本上说,你可能应该阅读Joel的文章《每个软件开发人员绝对、肯定地必须了解Unicode和字符集的绝对最低限度》(没有借口!)。

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