bonjour

je ne suis pas un devloppeur, je travaille juste sur un petit projet d'application avec Clickteam Fusion 2.5 (programmation sans code)

Voilà maintenant des heures et des heure que je bute sur un probleme sans solutions...
J'ai vraiment besoin d'aide....

Comme mon programme doit echanger des données avec le serveur, et que je ne peux pas utiliser ssl (https); je suis obligé de crypter les données.
Pour cela je ne dispose que de l'agorythme de chiffrement AES ( plus presisement 128 bits, et Mode ECB).

Une clé permet de crypter/decrypter un texte.
la clé fait 16 caractères; par exemple "1111222233334444"

Par exemple pour "hello world", avec mon programme j'obtiens "9F3B0437A62248E9A1D914201532C9A9"

Pour le serveur j'obtenais : "/ùkà€¯`ã·p*6©â" avec ce php suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
<?php
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, '1111222233334444', 'hello world', MCRYPT_MODE_ECB);
echo $ciphertext;
?>
Apres des heures et des heures de recherche, j'ai reussi à trouver un script qui me donne le meme resultat : "9F3B0437A62248E9A1D914201532C9A9"
la personne qui avait posté ce script (il y a des années), a ajouté "Basically what has to happen, is the returned encryption must be padded out, then turned to uppercase hex. Then it'll work like a charm in AES Fusion..."

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$password = "1111222233334444"; //MUST be 16 characters
$text = "hello world";
 
function aes_encrypt($val,$ky) {
    $mode=MCRYPT_MODE_ECB;    
    $enc=MCRYPT_RIJNDAEL_128;
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
    return mcrypt_encrypt($enc, $ky, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
}
 
echo strtoupper(bin2hex(aes_encrypt($text,$password)));
?>
Il y a donc une solution pour que mon programme et mon serveur crypte de la meme maniere, cependant, je n'arrive pas à faire l'operation inverse, c'est à dire decrypter. je n'ai que la possibiliter de crypter une donnée du serveur et l'envoyer au programme client, mais le serveur ne peut pas decrypter une donnée cryptée envoyée par le programme...

Apres encore des recherches, il s'avere s’avère que ce probleme de compabilité existe egalement chez MySql...

Le script qui me permet de cripter "hello world" en "9F3B0437A62248E9A1D914201532C9A9" proviens apparement de ce script suivant : ( ou $val = texte et $ky la clé)

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
function aes_decrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode = MCRYPT_MODE_ECB; 
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND) ); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
} 
 
function aes_encrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode=MCRYPT_MODE_ECB; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND)); 
}

j'ai beau essayer beaucoup de variantes, je n'arrive pas a obtenir le decrypt de "9F3B0437A62248E9A1D914201532C9A9" en "hello world"....

Avec ce script j'obtiens : "D•Ã*€BË> vóÜBäô‚vZŠáNJ}fšæÚ+ñ"....
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
<?php 
$ky ="1111222233334444";
$val ="9F3B0437A62248E9A1D914201532C9A9";
function mysql_aes_decrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode = MCRYPT_MODE_ECB; 
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM ) ); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
} 
 
function mysql_aes_encrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode=MCRYPT_MODE_ECB; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM)); 
} 
echo mysql_aes_decrypt($val,$ky);
?>
Quelqu'un/e pourrait-il m'aider ou me dire ou se situe mon erreur?

Merci