Bien le bonjour, amis développeurs.

Je suis actuellement sur le développement d'un système client-serveur, communicant à l'aide d'un protocole bien spécifique. Les données transmises sont crypté via AES.

Là ou les problèmes arrive, c'est que le serveur est en C, et le client en PHP ! Et j'ai un soucis de cryptage entre les deux.

Voici un code d'exemple de cryptage C:
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
#include <openssl/aes.h>
#include <cstdio>
#include <cstring>
 
void dump(const char* str)
{
    int size = (int)strlen((char*)str);
    for (int i=0; i<size; i++)
    {
        printf("#%02X",(unsigned char)(str[i]));
    }
    printf("\n");
}
 
int main()
{
    unsigned char inbuf[1024]="Hello,world!";
    unsigned char encbuf[1024] = {0};
 
    unsigned char key32[] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
    unsigned char iv[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    unsigned char deciv[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
 
    AES_KEY aeskey;
    AES_KEY aesdeckey;
 
    //Now enrypt
    memset(encbuf, 0, sizeof(encbuf));
    AES_set_encrypt_key(key32, 32*8, &aeskey);
    AES_cbc_encrypt(inbuf, encbuf, 16, &aeskey, iv, AES_ENCRYPT);
 
    //Now decrypt
    unsigned char decbuf[1024];
    memset(decbuf, 0, sizeof(decbuf));
 
    AES_set_decrypt_key(key32, 32*8, &aesdeckey);
    AES_cbc_encrypt(encbuf, decbuf, 16, &aesdeckey, deciv, AES_DECRYPT);
 
 
    //Display the results
    printf("Original: \n"); dump((const char*)inbuf);
    printf("ENCRYPTED: \n"); dump((const char*)encbuf);
    printf("DECRYPTED: \n"); dump((const char*)decbuf);
 
    return 0;
}
Son pendant, version PHP:
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
<?php
 
function dump($str)
{
    for ($i=0; $i<strlen($str); $i++)
        echo sprintf('#%02X',ord($str[$i]));
    echo "\n";
}
 
$inbuf  = "Hello,world!";
 
$key32  = str_repeat(chr(0xaa),32);
$iv     = str_repeat(chr(0x00),16);
$deciv  = str_repeat(chr(0x00),16);
 
$encbuf = openssl_encrypt($inbuf, 'AES-256-CBC', $key32, true, $iv);
$decbuf = openssl_decrypt($encbuf, 'AES-256-CBC', $key32, true, $deciv);
 
printf("Original: \n"); dump($inbuf);
printf("ENCRYPTED: \n"); dump($encbuf);
printf("DECRYPTED: \n"); dump($decbuf);
Et en exécution, cela me donne.
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
$ php ssl.php
Original:
#48#65#6C#6C#6F#2C#77#6F#72#6C#64#21
ENCRYPTED:
#01#9C#B2#9A#99#B2#9E#7B#09#11#63#66#6B#5E#12#EA
DECRYPTED:
#48#65#6C#6C#6F#2C#77#6F#72#6C#64#21
 
$ g++ ssl.cpp -lssl  -o ssl && ./ssl
Original:
#48#65#6C#6C#6F#2C#77#6F#72#6C#64#21
ENCRYPTED:
#8C#E3#47#BD#50#83#D3#BF#58#B4#2C#CD#56#9F#07#82
DECRYPTED:
#48#65#6C#6C#6F#2C#77#6F#72#6C#64#21

Bien que le cryptage soit correctement effectué, en AES 256 CBC, la chaîne ENCRYPTED est différente entre les deux codes, ce qui pose un gros soucis de communication, vu que c'est celle qui est censé être transmise.
J'ai fait beaucoup de test, mais aucun moyen d'obtenir un résultat homogène entre les deux.

Si quelqu'un à la moindre idée sur ce qui cloche, il me sera d'un grand secours....

Merci beaucoup.