Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 密码加密解密UTF8编码字符串转换不';行不通_C#_Windows Phone 8_Encryption_Utf 8 - Fatal编程技术网

C# 密码加密解密UTF8编码字符串转换不';行不通

C# 密码加密解密UTF8编码字符串转换不';行不通,c#,windows-phone-8,encryption,utf-8,C#,Windows Phone 8,Encryption,Utf 8,我想在本地数据库中保存加密的密码(在windows phone上)。为此,我首先要用这个加密密码 byte[] passwordInByte = UTF8Encoding.UTF8.GetBytes(clearPW); byte[] protectedPasswordByte = ProtectedData.Protect(passwordInByte, null); return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, pro

我想在本地数据库中保存加密的密码(在windows phone上)。为此,我首先要用这个加密密码

byte[] passwordInByte = UTF8Encoding.UTF8.GetBytes(clearPW);
byte[] protectedPasswordByte = ProtectedData.Protect(passwordInByte, null);
return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, protectedPasswordByte.Length);
当我使用此密码时,我会得到如下加密密码:

“\0賐�ᔁᇑ窌쀀쉏\0쐮�毸䉯놜侫䅛\0\0\0\0昐\0Ā\0 \0⎛폳띪ꌾၜჸ㸴뀲േꞪ賂ﯛ䎳웠姒\0\0耎\0Ȁ\0 \0tƽ팃ல�쿄갗ꪄ᫓\0꒱௴贒⊡噷�ʥ魚@\0챞Ċ뽨뒸縉菒Æ�≁ᦹ諻⋤떵孵ר䒹춳✴頻ľ�뚿㠔꾹놼ɝ⍔" 受保护的密码PasswordByte的长度为230字节

我的解密函数如下所示:

byte[] encryptedBytes = UTF8Encoding.UTF8.GetBytes(encrytpedPW);
byte[] passwordByte = ProtectedData.Unprotect(encryptedBytes, null);
return UTF8Encoding.UTF8.GetString(passwordByte, 0, passwordByte.Length);
现在enycrptedBytes数组的长度为290字节,密码甚至无法解密,因为Unprotect函数抛出错误“无效数据”

但如果我使用Convert.BaseString64函数,则一切正常:

加密:

byte[] passwordInByte = UTF8Encoding.UTF8.GetBytes(clearPW);
byte[] protectedPasswordByte = ProtectedData.Protect(passwordInByte, null);
return Convert.ToBase64String(protectedPasswordByte, 0, protectedPasswordByte.Length);
解密:

byte[] encryptedBytes = Convert.FromBase64String(encrytpedPW);
byte[] passwordByte = ProtectedData.Unprotect(encryptedBytes, null);
return UTF8Encoding.UTF8.GetString(passwordByte, 0, passwordByte.Length);
你们中有人知道UTF8编码有什么错吗?因为第一种方法是MSDN推荐的was编码。

不要这样做:

return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, protectedPasswordByte.Length);
首先,为了清晰起见,我强烈建议使用
编码.UTF8
而不是
UTF8Encoding.UTF8
。这不会解决问题,但养成一个好习惯-在
编码上声明
UTF8
属性,而不是
UTF8Encoding
,因此更清楚地认识到这一点

主要的问题是你没有得到文本数据。当你得到的二进制数据不是常规编码的文本数据时,你不应该使用
编码.GetString
。你得到的是不代表文本的任意二进制数据(直到它被解密)

Base64被精确地设计为以ASCII文本表示任何二进制数据,因此您不会因为二进制数据没有任何“直线”而丢失任何数据“您决定使用的任何编码中的文本表示。任何时候,当您想将任意二进制数据编码为文本时,都应该使用Base64或hex或类似的东西。

请不要这样做:

return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, protectedPasswordByte.Length);
首先,为了清晰起见,我强烈建议使用
Encoding.UTF8
而不是
UTF8Encoding.UTF8
。这不会解决问题,但养成一个好习惯-在
编码上声明
UTF8
属性,而不是
UTF8Encoding
,因此更清楚地认识到这一点

主要的问题是你没有文本数据。当您得到的二进制数据不是常规编码的文本数据时,不应该使用
Encoding.GetString
。您得到的是不表示文本的任意二进制数据(在解密之前)

Base64被精确地设计为以ASCII文本表示任何二进制数据,因此您不会因为二进制数据而丢失任何数据,而二进制数据在您决定使用的任何编码中都没有任何“直接”文本表示。任何时候,当您想将任意二进制数据编码为文本时,都应该使用Base64或hex或类似的东西。

请不要这样做:

return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, protectedPasswordByte.Length);
首先,为了清晰起见,我强烈建议使用
Encoding.UTF8
而不是
UTF8Encoding.UTF8
。这不会解决问题,但养成一个好习惯-在
编码上声明
UTF8
属性,而不是
UTF8Encoding
,因此更清楚地认识到这一点

主要的问题是你没有文本数据。当您得到的二进制数据不是常规编码的文本数据时,不应该使用
Encoding.GetString
。您得到的是不表示文本的任意二进制数据(在解密之前)

Base64被精确地设计为以ASCII文本表示任何二进制数据,因此您不会因为二进制数据而丢失任何数据,而二进制数据在您决定使用的任何编码中都没有任何“直接”文本表示。任何时候,当您想将任意二进制数据编码为文本时,都应该使用Base64或hex或类似的东西。

请不要这样做:

return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, protectedPasswordByte.Length);
首先,为了清晰起见,我强烈建议使用
Encoding.UTF8
而不是
UTF8Encoding.UTF8
。这不会解决问题,但养成一个好习惯-在
编码上声明
UTF8
属性,而不是
UTF8Encoding
,因此更清楚地认识到这一点

主要的问题是你没有文本数据。当您得到的二进制数据不是常规编码的文本数据时,不应该使用
Encoding.GetString
。您得到的是不表示文本的任意二进制数据(在解密之前)


Base64被精确地设计为以ASCII文本表示任何二进制数据,因此您不会因为二进制数据而丢失任何数据,而二进制数据在您决定使用的任何编码中都没有任何“直接”文本表示。当您想将任意二进制数据编码为文本时,应该使用Base64或hex或类似的东西。

对不起。Unicode只是一次尝试,在UTF8的情况下也发生了错误(正如您所提到的)。我把问题改了,对不起。Unicode只是一次尝试,在UTF8的情况下也发生了错误(正如您所提到的)。我把问题改了,对不起。Unicode只是一次尝试,在UTF8的情况下也发生了错误(正如您所提到的)。我把问题改了,对不起。Unicode只是一次尝试,在UTF8的情况下也发生了错误(正如您所提到的)。我在问题中改变了它。