AES 64 密钥生成
AES 64 key generation
我正在尝试生成 64 个十六进制数字以用作 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;
}
}
}
}
.NET framework 已经有一个生成对称密钥的方法Aes.GenerateKey(),请看这个MSDN文档:Aes class
我不明白为什么需要先将其转换为 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: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();
}
但您还不清楚为什么要通过 Base64+ToCharArray+ToInt32 重新路由。您将 0-255 范围(字节)中的值替换为 [A-Za-z0-9/=+] 范围集中的值,相当于 0-63(Base64 和所有);所以你 a) 不会有一个非常随机的密钥 b) 它会太长。
我正在尝试生成 64 个十六进制数字以用作 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;
}
}
}
}
.NET framework 已经有一个生成对称密钥的方法Aes.GenerateKey(),请看这个MSDN文档:Aes class
我不明白为什么需要先将其转换为 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: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();
}
但您还不清楚为什么要通过 Base64+ToCharArray+ToInt32 重新路由。您将 0-255 范围(字节)中的值替换为 [A-Za-z0-9/=+] 范围集中的值,相当于 0-63(Base64 和所有);所以你 a) 不会有一个非常随机的密钥 b) 它会太长。