2010-11-22 16 views
1

J'essaye de réaliser la même application DES que j'ai dans un code C# mais en PHP.DES Cryptage en PHP et C#

Le code C# ressemble à ceci:

public static string EncriptarCadena(string strEncriptar) 
{ 
    DESCryptoServiceProvider provider; 

    MemoryStream stream; 
    CryptoStream stream2; 
    string str2; 
    string str = "29393651"; 
    byte[] buffer2 = new byte[] { 0x45, 50, 0xa5, 0x18, 0x67, 0x58, 0xac, 0xba }; 
    byte[] bytes = new byte[0]; 
    try 
    { 
     bytes = Encoding.UTF8.GetBytes(str.Substring(0, 8)); 
     provider = new DESCryptoServiceProvider(); 
     byte[] buffer = Encoding.UTF8.GetBytes(strEncriptar); 
     stream = new MemoryStream(); 
     stream2 = new CryptoStream(stream, provider.CreateEncryptor(bytes, buffer2), CryptoStreamMode.Write); 
     stream2.Write(buffer, 0, buffer.Length); 
     stream2.FlushFinalBlock(); 
     str2 = Convert.ToBase64String(stream.ToArray()); 
    } 
    catch (Exception) 
    { 
     str2 = ""; 
    } 
    finally 
    { 
     provider = null; 
     stream = null; 
     stream2 = null; 
    } 
    return str2; 
} 

Et le code que je l'ai fait jusqu'à présent en PHP est le suivant:

function encrypt($string) { 
    //Key 
    $key = "29393651"; 
    $ivArray=array(0x45, 50, 0xa5, 0x18, 0x67, 0x58, 0xac, 0xba); 
    $iv=null; 
    foreach ($ivArray as $element) 
     $iv.=CHR($element); 

    echo "Key: $key IV: $iv<br>"; 

    $encrypted_string = mcrypt_encrypt(MCRYPT_DES, $key, $string, MCRYPT_MODE_CBC, $iv); 

    return base64_encode($encrypted_string); 
} 

Mais je ne peux pas trouver où est le problème, car ils ne donnent pas le même résultat pour la même entrée.

Toute aide sera la bienvenue :)

+0

Vous mettez en mode CBC dans le code PHP; Je ne vois pas un appel pour définir le mode CBC dans le code C#? AFAIK, la plupart des bibliothèques par défaut à la BCE. – staticsan

+0

Salut staticsan, j'ai vérifié que le mode par défaut en C# c'est CBC, de toute façon j'ai essayé de changer dans le code php entre tous les modes disponibles (ecb, cbc, cfb, ofb, nofb, stream) et ne fonctionnait pas: ( – fernandojsg

+0

Avez-vous vérifié que les octets d'entrée sont exactement les mêmes? Le C# fait une sous-chaîne et en fait utf8, et le php regarde simplement $ string – superfro

Répondre

2

Vérifiez votre padding. PHP tamponne en interne les données à chiffrer avec les NULL binaires \x00 par défaut qui n'est définitivement pas le mode de remplissage par défaut dans .NET (très probablement ils utilisent le remplissage PKCS7 par défaut).

+0

Hey Stefan, je l'ai réparé et ça marche! :) C'était le problème, j'ai implémenté le padding PKCS7 pour l'entrée en php et cela fonctionne correctement Merci beaucoup;) – fernandojsg

2

Merci beaucoup les gars. M'a aidé avec le même problème. rembourrage PKCS7 ici: How to add/remove PKCS7 padding from an AES encrypted string? changer juste à bce Cbc

est ici un court aperçu i utilisé:

$key = "29393651"; 
$iv = $key; 
$pass_enc = $mypassword; 
$block = mcrypt_get_block_size('des', 'cbc'); 
$pad = $block - (strlen($pass_enc) % $block); 
$pass_enc .= str_repeat(chr($pad), $pad); 
$pass_enc = mcrypt_encrypt(MCRYPT_DES, $key, $pass_enc, MCRYPT_MODE_CBC, $iv); 
$pass_enc = base64_encode ($pass_enc);