【问题标题】:DES Encryption in PHP and C#PHP 和 C# 中的 DES 加密
【发布时间】:2011-05-14 04:06:22
【问题描述】:

我正在尝试实现与我在 C# 代码中但在 PHP 中相同的 DES 加密。

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

但我找不到问题出在哪里,因为它们不会为相同的输入给出相同的结果。

非常欢迎任何帮助:)

【问题讨论】:

  • 您在 PHP 代码中设置了 CBC 模式;我没有在 C# 代码中看到设置 CBC 模式的调用? AFAIK,大多数库默认为 ECB。
  • 嗨 staticsan,我检查了 C# 中的默认模式是 CBC,无论如何我已经尝试在所有可用模式(ecb、cbc、cfb、ofb、nofb、stream)之间更改 php 代码也没有工作:(
  • 您是否验证输入字节完全相同? c# 正在做一个子字符串并将其设为 utf8,而 php 正在查看 $string
  • 嗨 superfro,我已经尝试过使用普通字符串,或者将其转换为 char 数组并折叠它,最后我猜在 php 中是相同的,至少我得到了相同的结果在 php 中的两个参数中,但仍然不同于 C# :(

标签: c# php encryption


【解决方案1】:

检查您的padding。默认情况下,PHP 在内部使用二进制 NULL \x00 填充要加密的数据,这绝对不是 .NET 中的默认填充模式(很可能它们默认使用 PKCS7 填充)。

【讨论】:

  • 嘿 Stefan,我修好了它,它可以工作了! :) 这是问题所在,我已经为 php 中的输入实现了 PKCS7 填充,并且它工作正常。非常感谢;)
【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多