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.

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
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
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
PS : Si j'utilise un vecteur identique � ma cl� c'est simplement pour simplifier le code exemple.


Merci � ceux qui pourront m'apporter un �clairage sur ce probl�me