Question

Je ne sais pas beaucoup sur le cryptage, mais j'ai pu obtenir le fonctionnement AES en PHP ... un peu. Voici quelques fonctions que j'utilise:

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)); 
} 

Ces sont légèrement modifiées d'un commentaire sur la page de documentation PHP pour mcrypt . (Je l'ai changé de dev_urandom rand, comme je suis sur une fenêtre boîte, où dev_urandom ne sont pas disponibles).

En tout cas l'utilisation touche I dans cette fonction est définie comme ceci:

define("PSK", pack("H*", "abcd7b5ca46e12345678a8161fdacee9"));

J'appelle ma fonction comme ceci:

echo bin2hex(aes_encrypt("wootwootwootwootwootwootwoo", PSK));

Maintenant, les 16 premiers octets (32 chiffres) de la chaîne hexadécimale résultante sont très bien. Les 16 octets suivants ne correspondent pas à ce qui est attendu.

Voir, je signale ces données à un webservice externe qui déchiffre ensuite. Je (malheureusement) ne peut pas donner le cas d'un test je sans remettre ma clé de chiffrement et des données. Je suis terriblement désolé, mais j'espère que quelqu'un familier avec mcrypt peut regarder et me dire ce que je fais mal.

Encore une fois, désolé de l'absence d'un test solide, mais je suis très reconnaissante de toute aide que vous pouvez donner!

EDIT: Il semble que mon fournisseur que je suis annonce à l'aide d'un est nulle IV. Suivant les conseils de Rook, je suis passé en mode CBC et supprimé le code inutile lié à la clé. Voici mes nouvelles fonctions:

function aes_decrypt($val,$key)
{
    $mode = MCRYPT_MODE_CBC;
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, null); 
    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,$key) 
{
    $mode = MCRYPT_MODE_CBC;
    $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, null); 
}
Était-ce utile?

La solution

Il est probable que ce service de chiffrement utilise un mode de chiffrement par bloc de fonctionnement différent comme CBC. Si un iv nul est utilisé en mode CBC, puis le premier bloc (dans ce cas, 16 octets) de la BCE et de Radio-Canada produira le même texte de chiffrement. le mode de la BCE ne devrait jamais être utilisé par une personne pour une raison quelconque.

Voici un exemple mode ECB message crypté:

text alt

Autres conseils

Moi et un collège de mine où coder une application iPhone et où en utilisant les méthodes ci-dessus pour crypter et décrypter les données. Mais nous avons trouvé un problème quand je cryptant les données à lire à partir de son iPhone. L'iPhone utilisé rembourrage PKCS7. Le code ci-dessus était d'ajouter un rembourrage supplémentaire cela provoquerait la méthode de déchiffrement iPhone à l'échec. Nous avons modifié le code pour résoudre le problème actuel:

public static function  aes128Encrypt($key,$val) 
{
    $mode = MCRYPT_MODE_CBC;
    $enc=MCRYPT_RIJNDAEL_128; 
    $blocksize= mcrypt_get_block_size($enc,$mode);
    $stringLength = strlen($val);
    $paddingLength =$blocksize-($stringLength%$blocksize);
    $val=str_pad($val,$paddingLength+$stringLength,chr($paddingLength));
    return base64_encode(mcrypt_encrypt($enc, $key, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")); 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top