C# AES-256 Unicode 密钥

C# AES-256 Unicode Key

我需要为 AES-256 制作强密钥 a) Unicode 字符,b) 以字节为单位的密钥。

a) 我必须生成 50 个随机 Unicode 字符,然后将它们转换为字节。是否可以使用 Unicode 字符作为 AES256 密钥? 例如我想用这个 page 来创建密码。 有什么方法可以将 Windows 个字符 table 中的所有字符导入到 Windows Form App 中编程?

b) 我正在使用此代码:

System.Security.Cryptography.AesCryptoServiceProvider key = new System.Security.Cryptography.AesCryptoServiceProvider();
key.KeySize = 256;
key.GenerateKey();
byte[] AESkey = key.Key;

够了还是我要换点东西?

另外还有一个问题。使 AES 密钥长于 43 个 ASCII 字符会更安全,还是无论如何都会散列为 256 位? 43个字符的ASCII密钥和100个字符有区别吗?

a) I have to generate 50 random Unicode characters and then convert them to bytes. Is this possible to use Unicode characters as AES256 key?

是的,这是可能的。由于您有足够的 space 用于字符,因此您可以对其进行编码。 ceil(32 / 3) * 4 = 44,所以你有足够的字符。不过,您不会使用 Unicode 编码提供的附加 space。显然你需要在使用它之前将它转换回二进制。

b) is aes.GenerateKey "enough"?

是的,aes.GenerateKey 足以生成二进制 AES 密钥。

c) Making an AES key longer then 43 ASCII characters will be more secure or it will be anyway hashed to 256bit? And there is difference between ASCII key of 43 characters and 100?

AES 密钥根本没有散列。它只是 128、192 或 256 位(即 16、24 或 32 字节)的数据,应该与随机数据无法区分(当然对于不知道其值的人而言)。如果你想散列一些东西,你必须自己做 - 但请继续阅读。

需要了解的重要一点是密码不是密钥,现代密码的密钥几乎总是编码为二进制。对于 AES,没有 ASCII 密钥这样的东西。如果您需要对密钥进行编码,请使用 base 64。

如果你想使用密码,那么你需要使用密钥派生函数或KDF。此外,如果您想防止字典和彩虹 table 攻击,您将需要使用基于 密码的 密钥派生函数或 PBKDF。这样的 KDF 也称为“密码哈希”。对于 .NET,您最好的选择是 Rfc2898DeriveBytes,它实现了 PBKDF2。 PBKDF2 在 RFC 中定义 2898 标题为:PKCS #5:Password-Based 密码学规范版本 2.0 您可能想要阅读。