Hello,
J'ai créé un projet Console pour tester deux-trois trucs dans le cadre de la création d'un module d'encryption pour un de mes projets.
L'encryption me semble correcte, mais la decryption pose problème.
J'utilise une passphrase qui va me générer un numéro aléatoire pour générer mes ma clé AES et mon IV. Ce numéro aleatoire est gardé afin de régénérer la même clé et IV AES (je dois absolument générer les clés à nouveaux lors du dechiffrement, je ne veux pas les garder).
Voici mon code de génération des clés et numéros aléatoires:
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public static byte[] generateKey(string passphrase, int keyLength) { if (_randomNumber == null || _randomNumber.Equals(null)) { _randomNumber = generateRandomNumber(); } Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(passphrase, _randomNumber, 20000); return derivedBytes.GetBytes(keyLength); }
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public static byte[] generateRandomNumber() { RNGCryptoServiceProvider secureRandomNumber = new RNGCryptoServiceProvider(); byte[] randomBytes = new byte[1024]; secureRandomNumber.GetBytes(randomBytes); _randomNumber = randomBytes; return randomBytes; }
Ma fonction de chiffrement:
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public static string encryptDataWithAES(string data, string passphrase) { byte[] encryptedData; AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); aes.BlockSize = 128; aes.KeySize = 256; aes.Mode = CipherMode.CFB; aes.Padding = PaddingMode.PKCS7; byte[] myAesKey = generateKey(passphrase, 32); byte[] myAesIV = generateKey(passphrase, 16); byte[] myData = System.Text.Encoding.Default.GetBytes(data); aes.Key = myAesKey; aes.IV = myAesIV; Console.WriteLine("AES Key : " + Convert.ToBase64String(myAesKey) + " (" + myAesKey.Length.ToString() + " bit)"); Console.WriteLine("AES IV : " + Convert.ToBase64String(myAesIV) + " (" + myAesIV.Length.ToString() + " bit)"); ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { // swEncrypt will write the values to the csEncrypt stream swEncrypt.Write(data); // csEncrypt.FlushFinalBlock(); } // msEncrypt contains the data encrypted encryptedData = msEncrypt.ToArray(); csEncrypt.Close(); } } return Convert.ToBase64String(encryptedData); }
Et ma fonction de déchiffrement qui pose problème:
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public static string decryptDataWithAES(string cipherText, string passphrase) { AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); aes.BlockSize = 128; aes.KeySize = 256; aes.Mode = CipherMode.CFB; aes.Padding = PaddingMode.PKCS7; byte[] myAesKey = generateKey(passphrase, 32); byte[] myAesIV = generateKey(passphrase, 16); byte[] myData = System.Convert.FromBase64String(cipherText); aes.Key = myAesKey; aes.IV = myAesIV; Console.WriteLine("AES Key : " + Convert.ToBase64String(myAesKey) + " (" + myAesKey.Length.ToString() + " bit)"); Console.WriteLine("AES IV : " + Convert.ToBase64String(myAesIV) + " (" + myAesIV.Length.ToString() + " bit)"); ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); byte[] byteBuffer = new byte[myData.Length]; int decryptedByteCount = 0; string test = null; using (MemoryStream msDecrypt = new MemoryStream(myData)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { test = srDecrypt.ReadToEnd(); } } msDecrypt.Close(); } return test; }
Et je me suis fais le petit programme suivant pour tester que le chiffrement et dechiffrement marche correctement:
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 static byte[] _randomNumber = null; static void Main(string[] args) { Console.WriteLine("Generating AES encrypted data.."); string data = encryptDataWithAES("this is a test", "jdeoq8i18919rhzflanv2ioa0ask"); Console.WriteLine("Data is encryptged. Press enter to see the cypher..."); Console.ReadLine(); Console.WriteLine(data); Console.ReadLine(); Console.WriteLine("Decrypting AES encrypted data..."); string decryptedData = decryptDataWithAES(data, "jdeoq8i18919rhzflanv2ioa0ask"); Console.WriteLine("To see if the data is correctly decrypted, please press enter."); Console.ReadLine(); Console.WriteLine(decryptedData); Console.ReadLine(); }
Lorsque je run le programme, j'obtiens ceci:
Je me suis mit un breakpoint car je ne voyais rien à l'écran, et effectivement ma variable decryptedData est égale à "".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Generating AES encrypted data.. AES Key : RUiWn3Etxn1JAZYCb4Vye1EhgmAf4z5vKeINcZV5NaM= (32 bit) AES IV : RUiWn3Etxn1JAZYCb4Vyew== (16 bit) Data is encryptged. Press enter to see the cypher... N78GCuFOMx8gjEM2ZfObJQ== Decrypting AES encrypted data... AES Key : RUiWn3Etxn1JAZYCb4Vye1EhgmAf4z5vKeINcZV5NaM= (32 bit) AES IV : RUiWn3Etxn1JAZYCb4Vyew== (16 bit) To see if the data is correctly decrypted, please press enter.
Je pense que c'est une erreur toute bête que je fais, mais je n'arrive pas à trouver ou elle est... j'ai fais quelques modification dans ma méthode de dechiffrage, mais rien n'y fais
Des idées?
Merci bien!
L.
Partager