我正在使用.NET生成加密消息。作为此过程的一部分,我生成一个在加密过程中使用的salt值,并且还将其传输给加密消息的接收者,以便他们可以解密消息。我想将salt作为文本字符串传输,但是当我尝试将salt字节数组转换为String时,我将每个字节用“破折号”分隔。例如..
45-A1-99-0C-C0-0C-C2-C2
这是生成盐的方法..
Public Shared Function GenerateSalt() As String
Dim rng As New RNGCryptoServiceProvider()
Dim buffer As Byte() = New Byte(7) {}
rng.GetBytes(buffer)
Return BitConverter.ToString(buffer)
End Function
我的问题是这个。如何将salt表示为接收者在解密过程中可以使用的字符串?
答案 0 :(得分:3)
最简单的方法是使用Convert.ToBase64String
方法将字节数组转换为字符串和Convert.FromBase64String
,反之亦然,例如。
var salt = new byte[] { 1, 2, 4, 8, 16, 32, 64, 128, 255 };
var s = Convert.ToBase64String(salt);
var b = Convert.FromBase64String(s);
在此示例中, s
变量保存值AQIECBAgQID/
,b
保存字节数组{ 1, 2, 4, 8, 16, 32, 64, 128, 255 }
,因此没有任何内容丢失。
是的,s
数组的salt
字符串和长度的长度不同。这是因为此处使用BASE64
(它有64个符号字母,但byte
可能包含256个不同的值)。
但是如果你想将你的字节数组转换为十六进制字符串,反之亦然,你会发现这个问题很有用:How do you convert Byte Array to Hexadecimal String, and vice versa, in C#?。
答案 1 :(得分:2)
也许System.Convert.ToBase64String
是可能的选择。 System.Convert.FromBase64String
将编码后的字符串转换回来。
答案 2 :(得分:1)
This可能会有所帮助:
public static string CreateRandomPassword(int PasswordLength)
{
String _allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ23456789";
Byte[] randomBytes = new Byte[PasswordLength];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randomBytes);
char[] chars = new char[PasswordLength];
int allowedCharCount = _allowedChars.Length;
for(int i = 0;i<PasswordLength;i++)
{
chars[i] = _allowedChars[(int)randomBytes[i] % allowedCharCount];
}
return new string(chars);
}