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从字符串Rfc2898DeriveBytes的输出取决于什么以及应如何处理盐?
我想问点加密方法,生成密钥,在
var key = new Rfc2898DeriveBytes(CodeInByte, salt, 1000);
当从输入字符串生成的密钥,或者它只是一个随机生成的字节数组?
和,是盐需要是静态的或不
密钥是从字符串和salt生成的,迭代计数也是影响结果和运行时间的算法的参数。盐不需要是静态的,但是如果你使用不同的盐,你会得到一个不同的密钥,所以在解密方面需要和给定的加密方法相同。 –
盐必须是随机的。不要使用静态盐,因为这会使密码具有确定性,因此不会在语义上安全。观察密文的攻击者可以确定何时之前发送了相同的消息前缀。盐不是秘密的,所以你可以把它和密文一起发送。通常,它只是在密文前面加上,然后在解密之前切掉。应该按照与初始化载体(IV)完全相同的方式处理盐。 –