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