2015-03-25 155 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