将字符串转换为Crypto API的字节数组

时间:2012-01-25 22:42:31

标签: encryption .net-3.5 cryptography c#-2.0

This article解释了为什么不应使用字符串编码来对密文进行往返。但是,如果我尝试使用推荐的Convert.ToBase64String,如果原始字符串未打包为4字节块,则会出现异常。在下面的示例中,原始字符串不起作用,但只是“Zoidberg”,因为它长8个字节(在使用Convert.ToBase64String时打包成6字节数组)。

正如文章中所承诺的,如果我使用任何字符串编码,我在解密值时会收到“错误数据”错误。那么原始字符串应该如何作为字节数组输入加密API?

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));

1 个答案:

答案 0 :(得分:0)

我认为你被这篇文章误导了。 转换自string -> byte[] --> encrypted byte[] --> string是没有意义的,这篇文章正在向您展示 ,而不是

据推测,你想去string -> byte[] -> encrypted byte[] -> (network, whatever) -> encrypted byte[] -> byte[] -> string.使用Encoding以这种方式将字符串转换为字节是可以的。

我不知道为什么您链接的文章会警告您不要使用 加密字节 并将其直接转换回字符串。看起来很傻。

你说你试图对密文进行往返,所以我会使用包含字符串加密字节的字节数组来忘记base-64编码。