Шифрование DES в PHP и C # - PullRequest
       6

Шифрование DES в PHP и C #

1 голос
/ 23 ноября 2010

Я пытаюсь получить ту же самую запись DES, что и в коде C #, но в PHP.

Код 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);
}

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

Любая помощь будет приветствоваться :)

Ответы [ 2 ]

2 голосов
/ 24 ноября 2013

Большое спасибо, ребята. Помог мне с той же проблемой. Заполнение PKCS7 здесь: Как добавить / удалить заполнение PKCS7 из зашифрованной строки AES? просто измените 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);
2 голосов
/ 23 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...