【发布时间】:2017-09-01 07:56:57
【问题描述】:
public string Encrypt(string Code)
{
string result = string.Empty;
byte[] encryptResult = null;
var CodeInByte = Encoding.ASCII.GetBytes(Code);
try
{
using (MemoryStream memo = new MemoryStream())
{
using (RijndaelManaged AES = new RijndaelManaged())
{
AES.KeySize = KeySize;
AES.BlockSize = BlockSize;
var key = new Rfc2898DeriveBytes(CodeInByte, salt, 1000);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
AES.Mode = CipherMode.CBC;
using (var encrypt = new CryptoStream(memo, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
encrypt.Write(CodeInByte, 0, CodeInByte.Length);
encrypt.Close();
}
encryptResult = memo.ToArray();
}
}
result = Convert.ToBase64String(encryptResult);
return result;
}
catch (Exception err)
{
MsgCode = 99;
MsgDesc = err.Message;
return string.Empty;
}
}
这只是一个简单的字符串AES加密方法
我想问的一点,在生成密钥时,在
var key = new Rfc2898DeriveBytes(CodeInByte, salt, 1000);
key 是从输入的字符串生成的,还是只是随机生成的字节数组?
而且,盐是否需要是静态的
【问题讨论】:
-
key是由string和salt生成的,迭代次数也是影响结果和运行时间的算法参数。 salt 不需要是静态的,但如果您使用不同的 salt,您将获得不同的密钥,因此它在解密端需要与给定加密时相同。
-
盐必须是随机的。不要使用静态盐,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前发送相同消息前缀的时间。盐不是秘密的,因此您可以将其与密文一起发送。通常,它只是简单地添加到密文中,并在解密之前被切掉。应该以与初始化向量 (IV) 完全相同的方式处理盐。
标签: c# cryptography salt pbkdf2