C#AES-256 Unicode密钥

时间:2016-01-20 18:22:53

标签: c# cryptography aes symmetric-key

我需要在a)Unicode字符中为AES-256建立强密钥,b)以字节为单位的密钥。

a)我必须生成50个随机Unicode字符,然后将它们转换为字节。这可以使用Unicode字符作为AES256密钥吗? 对于例如我想使用此page来创建密码。 有没有办法将Windows字符表中的所有字符导入Windows窗体应用程序中的程序?

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个

之间存在差异

1 个答案:

答案 0 :(得分:2)

  

a)我必须生成50个随机Unicode字符,然后将它们转换为字节。这可以使用Unicode字符作为AES256密钥吗?

是的,这是可能的。由于你有足够的空间可以对字符进行编码。 ceil(32/3)* 4 = 44,所以你有足够的角色。但是,您不会使用Unicode编码提供的额外空间。显然,在使用之前你需要将它转换回二进制文件。

  

b)aes.GenerateKey“足够”?

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

  

c)使AES密钥长一点,然后43个ASCII字符会更安全,或者无论如何都会散列到256位?并且43个字符的ASCII键与100个

之间存在差异

根本不对AES密钥进行哈希处理。它只是128,192或256位(即16,24或32字节)的数据,这些数据应该与随机无法区分(当然,对某些不知道该值的人来说)。如果你想要哈希,你必须自己做 - 但请继续阅读。

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

如果您想使用密码,则需要使用密钥派生函数或KDF。此外,如果您想要防止字典和彩虹表攻击,您将需要使用基于密码的密钥派生函数或PBKDF。这种KDF也称为“密码哈希”。对于.NET,最好的选择是Rfc2898DeriveBytes,它实现了PBKDF2。 PBKDF2在您可能想要阅读的RFC 2898 titled: PKCS #5: Password-Based Cryptography Specification Version 2.0中定义。