2010-11-22 3 views
1

Я пытаюсь достичь той же самой концепции DES, что и у C# кода, но на PHP.DES Шифрование в PHP и C#

C# код выглядит следующим образом:

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

И код, который я сделал до сих пор в PHP является следующее:

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

Но я не могу найти, где находится проблема, поскольку они не дают одинакового результата для одного и того же ввода.

Любая помощь будет очень кстати :)

+0

Вы настройки режима CBC в коде PHP; Я не вижу вызова для установки режима CBC в коде C#? AFAIK, большинство библиотек по умолчанию для ECB. – staticsan

+0

Привет, staticsan, я проверил, что режим по умолчанию на C# это CBC, в любом случае я попытался изменить в php-коде между всеми доступными режимами (ecb, cbc, cfb, ofb, nofb, stream) и не работал: ( – fernandojsg

+0

Вы проверили, что входные байты являются точно такими же? C# один выполняет подстроку и делает ее utf8, а php просто ищет строку $ – superfro

ответ

2

Проверьте padding. PHP внутренне заполняет данные, которые должны быть зашифрованы двоичными NULL \x00 по умолчанию, который по умолчанию не является стандартным по умолчанию в .NET (скорее всего, они используют по умолчанию PKCS7).

+0

Эй, Стефан, я исправил его и это работает! :) Это была проблема, я внедрил дополнение PKCS7 для ввода в php, и он работает правильно. Большое спасибо;) – fernandojsg

2

Большое спасибо, ребята. Помог мне с той же проблемой. PKCS7 обивка здесь: How to add/remove PKCS7 padding from an AES encrypted string? просто изменить ECB на CBC

здесь короткий снимок я использовал:

$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); 
Смежные вопросы