我需要在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个
之间存在差异答案 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中定义。