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:
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
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; }
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
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);
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.
Partager