AES 64密钥生成

时间:2016-10-19 14:20:49

标签: c# cryptography aes

我正在尝试生成64个HEX数字以用作AES 256键但没有成功。 有人可以指出错误和更好的方法来生成相同的错误。

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 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分: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进行重新路由也很不清楚。您将使用[A-Za-z0-9 / = +]范围集中的值替换0-255范围(字节)中的值,相当于0-63(Base64和all);所以你a)不会有一个非常随机的密钥和b)它会太长。

答案 2 :(得分:2)

.NET框架已经有一个用于生成对称密钥的方法Aes.GenerateKey(),请查看此MSDN文档:Aes class