2016-10-19 5 views
1

Я пытаюсь сгенерировать 64 символа HEX для использования в качестве ключа AES 256 без успеха. Может кто-нибудь указать на ошибки и лучший способ генерировать то же самое.Генерация ключей AES 64

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text.RegularExpressions; 
using System.Security.Cryptography; 

namespace Test 
{ 
    public class Program 
    { 
     static System.Text.StringBuilder builder = new System.Text.StringBuilder(); 
     public static void Main(string[] args) 
     { 
      String randomNumber = Convert.ToBase64String (GenerateRandomNumber(32)); 
      Console.WriteLine(randomNumber); 

      string input = randomNumber; 
      char[] values = input.ToCharArray(); 
      foreach (char letter in values) 
      { 
       // Get the integral value of the character. 
       int value = Convert.ToInt32(letter); 
       // Convert the decimal value to a hexadecimal value in string form. 
       string hexOutput = String.Format("{0:X}", value); 
       // Console.WriteLine("Hexadecimal value of {0} is {1}", letter, hexOutput); 
       builder.Append(hexOutput); 
      } 

      Console.WriteLine(builder); 
     } 


     public static byte[] GenerateRandomNumber(int length) 
     { 
      using (var randomNumberGenerator = new RNGCryptoServiceProvider()) 
      { 
       var randomNumber = new byte[length]; 
       randomNumberGenerator.GetBytes(randomNumber); 
       return randomNumber; 
      } 
     } 
    } 
} 

ответ

3

Я не понимаю, почему вы должны преобразовать его в base64 сначала. Это может быть так просто, как это:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var key = GenerateRandomNumber(32); 
     var hexEncodedKey = BitConverter.ToString(key).Replace("-", ""); 
     Console.WriteLine(hexEncodedKey); 
    } 

    public static byte[] GenerateRandomNumber(int length) 
    { 
     using (var randomNumberGenerator = RandomNumberGenerator.Create()) 
     { 
      var randomNumber = new byte[length]; 
      randomNumberGenerator.GetBytes(randomNumber); 
      return randomNumber; 
     } 
    } 
} 
+0

Вы правы. База 64 вообще не нужна. Без базы 64 это работает также с RNGCryptoServiceProvider. Благодаря! –

2

рамки .NET уже есть метод Aes.GenerateKey() для генерации симметричных ключей, пожалуйста, посмотрите на этой документации MSDN: Aes class

3

Ваша самая большая техническая проблема заключается в том, что вы использовали {0:X}, когда вы имели в виду {0:X2}. Если значение равно 10, то первое производит «A», а последнее «0A». Так как вы потеряли место, где все нули в вашем номере не восстанавливаются.

internal static string ByteArrayToHex(this byte[] bytes) 
{ 
    StringBuilder builder = new StringBuilder(bytes.Length * 2); 

    foreach (byte b in bytes) 
    { 
     builder.Append(b.ToString("X2")); 
    } 

    return builder.ToString(); 
} 

(код копируется из https://github.com/dotnet/corefx/blob/7cad8486cbabbce0236bdf530e30db7036335524/src/Common/tests/System/Security/Cryptography/ByteUtils.cs#L37-L47)

Но это также очень понятно, почему вы переразводки через Base64 + ToCharArray + ToInt32. Вы заменяете значения в диапазоне 0-255 (байты) значениями в диапазоне [A-Za-z0-9/= +], что эквивалентно 0-63 (Base64 и все); поэтому вы a) не имели бы очень случайного ключа, и б) он будет слишком длинным.

Смежные вопросы