Encryption 将字符串转换为加密API的字节数组
解释为什么不应使用字符串编码来往返密码文本。但是,如果我尝试使用推荐的Encryption 将字符串转换为加密API的字节数组,encryption,.net-3.5,cryptography,c#-2.0,Encryption,.net 3.5,Cryptography,C# 2.0,解释为什么不应使用字符串编码来往返密码文本。但是,如果我尝试使用推荐的Convert.ToBase64String,如果原始字符串未打包为4字节块,则会出现异常。在下面的示例中,原始字符串不起作用,但只有“Zoidberg”起作用,因为它有8个字节长(当使用Convert.ToBase64String时,这些字节被打包成6个字节的数组) 正如在文章中承诺的,如果使用任何字符串编码,在解密返回值时会出现“坏数据”错误。那么,如何将原始字符串作为字节数组输入加密API呢? string text=
Convert.ToBase64String
,如果原始字符串未打包为4字节块,则会出现异常。在下面的示例中,原始字符串不起作用,但只有“Zoidberg”起作用,因为它有8个字节长(当使用Convert.ToBase64String
时,这些字节被打包成6个字节的数组)
正如在文章中承诺的,如果使用任何字符串编码,在解密返回值时会出现“坏数据”错误。那么,如何将原始字符串作为字节数组输入加密API呢?
string text=“Zoidberg很重要!”;
RSACryptoServiceProvider=新的RSACryptoServiceProvider();
//这引发FormatException:“输入不是有效的Base-64字符串,因为它是
//包含一个非基64字符,两个以上的填充字符,
//或填充字符中的非空白字符“
byte[]cipherText=provider.Encrypt(Convert.FromBase64String(text),false);
字符串明文=Convert.ToBase64String(provider.Decrypt(密文,false));
我认为你被那篇文章误导了。
从string->byte[]-->encrypted byte[]-->string
转换是没有意义的,这篇文章向您展示了不做的事情
大概,您希望转到string->byte[]->encrypted byte[]->(网络,无论什么)->encrypted byte[]->byte[]->string。
可以使用编码以这种方式将字符串转换为字节
我不知道为什么你链接的文章会警告你不要将加密的字节直接转换回字符串。看起来很傻
你说你在尝试对密文进行往返,所以我会使用包含字符串加密字节的字节数组,而忘记base-64编码。
FromBase64String
是“罪魁祸首”(但不是真的)。它需要“=”填充(参见维基百科)。但是,由于“Zoigberg…”无论如何都不是有效的base-64字符串,即使填充正确,它仍然是无效输入。
string text = "Zoidberg is important!";
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
// This throws FormatException: "The input is not a valid Base-64 string as it
// contains a non-base 64 character, more than two padding characters,
// or a non-white space character among the padding characters"
byte[] cipherText = provider.Encrypt(Convert.FromBase64String(text), false);
string plainText = Convert.ToBase64String(provider.Decrypt(cipherText, false));