如何使用任何密钥进行加密

时间:2015-03-25 07:37:55

标签: c# encryption

我正在使用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

1 个答案:

答案 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是一些随机的字节数组,无论它实际上是什么。它只需要为密钥生成带来更多的随机性,并且可以是任何一个(但始终相同,以确保您从相同的密码生成相同的密钥)。