【发布时间】:2019-01-01 11:04:43
【问题描述】:
我找到了一个使用 AES 加密来加密文本的示例。代码是这样的:
public static string Encrypt(string PlainText, string Password,
string Salt = "Kosher", string HashAlgorithm = "SHA1",
int PasswordIterations = 2, string InitialVector = "OFRna73m*aze01xY",
int KeySize = 256)
{
if (string.IsNullOrEmpty(PlainText))
return "";
byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);
byte[] SaltValueBytes = Encoding.ASCII.GetBytes(Salt);
byte[] PlainTextBytes = Encoding.UTF8.GetBytes(PlainText);
PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);
byte[] KeyBytes = DerivedPassword.GetBytes(KeySize / 8);
RijndaelManaged SymmetricKey = new RijndaelManaged();
SymmetricKey.Mode = CipherMode.CBC;
byte[] CipherTextBytes = null;
using (ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes))
{
using (MemoryStream MemStream = new MemoryStream())
{
using (CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write))
{
CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length);
CryptoStream.FlushFinalBlock();
CipherTextBytes = MemStream.ToArray();
MemStream.Close();
CryptoStream.Close();
}
}
}
SymmetricKey.Clear();
return Convert.ToBase64String(CipherTextBytes);
}
我的问题是:AES 算法的密钥是如何生成的?这两行:
PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);
byte[] KeyBytes = DerivedPassword.GetBytes(KeySize / 8);
首先,它创建一个 256 字节的派生密钥,然后,创建一个获取该派生密钥的伪随机字节的密钥。它必须除以 8,因为 AES 算法需要 128、182 或 256 位,而不是字节。在这种情况下,如何派生密钥是 256 字节,AES 的密钥将是 256 位。
但它为什么要这样做呢?创建具有所需长度而不是 256 字节而是 256 位(256 字节 / 8)的派生密钥不是更好吗?因此不需要使用派生密钥的 1/8 字节创建新密钥。
另外,getBytes() 方法,在该方法的描述中,它说它返回伪随机密钥字节。那么在每种情况下,AES密钥不是不同吗?如果是伪随机密钥字节,如何从解密中再次生成 AES 密钥?
谢谢。
【问题讨论】:
-
我不清楚你在问什么。它使用它获得的所有信息创建
PasswordDerivedBytes,然后要求从该信息生成KeySize / 8字节。大概KeySize是以位为单位的,但PasswordDerivedBytes.GetBytes是以字节为单位的。 (很多代码都是非常规的,特别是在参数/变量名称方面,这无济于事 - 您可能想找到另一个示例。) -
注意:你应该使用
Rfc2898DeriveBytes,因为PasswordDeriveBytes已经过时了。