Представление значения соли в виде строки - PullRequest
0 голосов
/ 29 марта 2011

Я создаю зашифрованное сообщение, используя .NET.В рамках этого процесса я генерирую солт-значение, которое используется в процессе шифрования и также передается получателю зашифрованного сообщения, чтобы они могли расшифровать сообщение.Я хочу передать соль в виде текстовой строки, но когда я пытаюсь преобразовать массив байтов соли в строку, я получаю каждый байт, разделенный "тире".Например ..

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

У меня такой вопрос.Как представить соль в виде строки, которую получатель может использовать в процессе расшифровки?

Ответы [ 3 ]

3 голосов
/ 29 марта 2011

Самый простой способ - использовать 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 различных значений).

Но если вы хотите преобразовать свой байтовый массив в шестнадцатеричную строку и наоборот, вам может пригодиться этот вопрос: Как преобразовать байтовый массив в шестнадцатеричную строку и наоборот в C #? .

2 голосов
/ 29 марта 2011

Возможно System.Convert.ToBase64String - возможный вариант.System.Convert.FromBase64String преобразует закодированную строку обратно.

1 голос
/ 29 марта 2011

Это может помочь:

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