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