Bonjour à tous,
J'ai un problème qui me fait tourner en rond depuis un moment.
J'ai des programmes qui se communiquent des données via une base SQL.
Par sécurité, une partie de ces données (de petits fichiers en fait) sont cryptées et stockés temporairement en varbinary dans la base.
Ces données cryptées peuvent correspondre à des fichiers texte ou XML (UTF-8 sans BOM).
Le programme C++ est en charge de décrypter les données.
Quand je décrypte des fichiers texte, pas de problème, tout fonctionne bien.
Pour les fichier XML, le déchiffrement échoue vers la fin du fichier avec l'erreur : 0x024e1e64 { "Longueur des données à déchiffrer non valide."}
Le programme ressemble à cela :
Code : 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
42
43
44
45
46 array<Byte>^ Projet1::EncryptBytes_AES(array<Byte>^ cipheredData, int myLength, String myPassword) { RijndaelManaged^ myRijndael = gcnew RijndaelManaged(); UTF8Encoding^ utf8 = gcnew UTF8Encoding; array<Byte>^ encodedBytes = utf8->GetBytes(myPassword); array<Byte>^ Key = encodedBytes; array<Byte>^ IV = encodedBytes; MemoryStream^ msDecrypt; CryptoStream^ csDecrypt; StreamReader^ srDecrypt; MemoryStream^ msResult = gcnew MemoryStream(myLength); array<Byte>^ resultat; RijndaelManaged^ aesAlg; String^ plaintext; aesAlg = gcnew RijndaelManaged(); aesAlg->Padding = PaddingMode::None; aesAlg->Key = Key; aesAlg->IV = IV; ICryptoTransform^ decryptor = aesAlg->CreateDecryptor(aesAlg->Key, aesAlg->IV); msDecrypt = gcnew MemoryStream(cipheredData); csDecrypt = gcnew CryptoStream(msDecrypt, decryptor, CryptoStreamMode::Read); srDecrypt = gcnew StreamReader(csDecrypt); csDecrypt->CopyTo(msResult); resultat = msResult->ToArray(); if (srDecrypt) srDecrypt->Close(); if (csDecrypt) csDecrypt->Close(); if (msResult) msResult->Close(); if (msDecrypt) msDecrypt->Close(); if (aesAlg) aesAlg->Clear(); return resultat; }
Pour information, le programme d'origine qui crypte les données est un programme VB.NET qui ressemble à cela.
Et curieusement, si j'utilise en VB.NET un programme équivalent au C++ pour décrypter mes fichiers XML, là, aucuns problèmes.
Code : 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 Public Function MSecureB (ByVal Source() As Byte, ByVal MyPassword as String) As Byte() Using aesAlg As Aes = Aes.Create() aesAlg.Key = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword) aesAlg.IV = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword) Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV) Using msEncrypt As New MemoryStream() Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write) csEncrypt.Write(Source, 0, Source.Length) csEncrypt.FlushFinalBlock() Return msEncrypt.ToArray() End Using End Using End Using End Function
PS : Si j'utilise un vecteur identique à ma clé c'est simplement pour simplifier le code exemple.
Code : 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 Public Function MSecureDecrypte_ByteArray(ByVal Source As Byte(), ByVal MyPassword as String) As Byte() Using aesAlg As Aes = Aes.Create() aesAlg.Key = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword) aesAlg.IV = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword) Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV) Using msDecrypt As New MemoryStream(Source) Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read) Using srDecrypt As New StreamReader(csDecrypt) Using ms2 As New MemoryStream() csDecrypt.CopyTo(ms2) MSecureDecrypte_ByteArray = ms2.ToArray() End Using End Using End Using End Using End Using End Function
Merci à ceux qui pourront m'apporter un éclairage sur ce problème
Partager