2015-03-25 118 views
1

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

但如果我这样做,我会得到异常:

型“System.FormatException”未处理的异常出现在mscorlib.dll 其他信息:Base-64字符数组或字符串的无效长度。

如果你想看到的算法,这是链接:https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx所有的

回答

2

首先,字符串“密码”是不是有效的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是一个字节的一些随机排列,不要紧,它实际上将是什么。它只需要将更多的随机性带入密钥生成中,并且可以是任何密钥生成(但始终保持一致,以确保您从相同的密码生成相同的密钥)。

+0

谢谢。以及如何回去?如何从密钥获取密码? – Raskolnikov 2015-03-25 07:54:08

+2

为什么你需要从密钥获取密码?典型用例:用户提供密码,您正在生成密钥并使用该密钥进行加密/解密。反向密钥 - >密码根本不需要,而且,据我所知,这是不可能的。 – 2015-03-25 07:56:03

+0

@ merso0027如果您有任意长度的密码短语,您如何期望从密钥长度中获得密码短语?任意密码短语根本不可行。 – 2015-03-25 08:07:07