我正在使用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�
我需要将此文本发回浏览器,或将其保存到文件中,目前我不知道为什么我会收到这些字符?
答案 0 :(得分:6)
问题是你正在获取一个不是通过编码文本创建的字节数组,并像使用它一样使用它。您只能解码通过编码创建的数据,如果您解码任何数据,最终会产生垃圾。
如果您希望加密产生的二进制数据为字符串,请使用例如base64编码:
string output = Convert.ToBase64String(encryptedData);
如果要解密数据,请使用Convert.FromBase64String
获取字节数组,对其进行解密,然后使用Encoding.UTF8.GetString
将其重新转换为原始字符串。它会对数据进行解码,因为它是从一开始就对字符串进行编码而创建的。
答案 1 :(得分:3)
这两行假装RSA加密的UTF-8序列的输出是有效的UTF-8序列:
var c = new UTF8Encoding();
string output = c.GetString(encryptedData);
但事实并非如此:RSA加密将字节值映射到其他(看似)任意字节值。生成的字节序列不会形成有效的UTF-8序列(没有理由假设它会),因此不能被视为一个。
如果您只想要一个可读(或HTTP可发送)的数据表示,那么Base64就是您的选择,如其他答案所示。但是,从根本上说,你应该阅读Joel关于The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)的文章。
答案 2 :(得分:2)
加密字符串将导致包含不可打印字符的字节数组。您需要将其转换为base64以获得它的可读版本。