将Salt值表示为String

时间:2011-03-29 13:35:46

标签: .net encryption bytearray salt

我正在使用.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表示为接收者在解密过程中可以使用的字符串?

3 个答案:

答案 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);
}