C# 密码加密解密UTF8编码字符串转换不';行不通
我想在本地数据库中保存加密的密码(在windows phone上)。为此,我首先要用这个加密密码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
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的情况下也发生了错误(正如您所提到的)。我在问题中改变了它。