我正在使用Rijndael对称算法实现加密。这是有效的,但我想改变这个工作与任何键。我不想生成密钥,我想让用户选择自己的密钥,比如他的加密密码。
RijndaelManaged myRijndael = new RijndaelManaged();
myRijndael.GenerateKey();
myRijndael.GenerateIV();
var encryptor = new RijndaelManagedEncryption();
var encrypted = encryptor.EncryptSettingValue(myRijndael.Key, "Encrypt this", myRijndael.IV);
例如像这样
RijndaelManaged myRijndael = new RijndaelManaged();
myRijndael.GenerateIV();
var key = Convert.FromBase64String("pasword")
var encryptor = new RijndaelManagedEncryption();
var encrypted = encryptor.EncryptSettingValue(key , "Encrypt this", myRijndael.IV);
但如果我这样做,我会得到例外:
mscorlib.dll中发生了未处理的“System.FormatException”类型异常 附加信息:Base-64字符数组或字符串的长度无效。
如果您想查看算法,请链接:https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx
答案 0 :(得分:2)
首先,字符串“password”不是有效的Base64
字符串,因此您无法按照自己的意愿进行转换。
而且,你不应该从某些字符串中“直接”获得加密密钥,因为它不会生成随机密钥。
使用Rfc2898DeriveBytes
代替:
var password = "pasword";
var salt = new byte[] { 0xe3, 0x5c, 0x51, 0x6a, 0x13, 0x55, 0x46, 0xf8, 0x75, 0xba, 0x54, 0xc3, 0x42, 0x5b, 0x70, 0xac };
var key = new Rfc2898DeriveBytes(password, salt).GetBytes(32);
这里salt
是一些随机的字节数组,无论它实际上是什么。它只需要为密钥生成带来更多的随机性,并且可以是任何一个(但始终相同,以确保您从相同的密码生成相同的密钥)。