Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在PHP上加密,但可以';t在C上解密#_C#_Php_Encryption_Des - Fatal编程技术网

C# 在PHP上加密,但可以';t在C上解密#

C# 在PHP上加密,但可以';t在C上解密#,c#,php,encryption,des,C#,Php,Encryption,Des,我有一个test.php,其中包含以下内容: echo encrypt("something"); function encrypt($str) { $enc_key = "my key is 8 char long"; $ivArray=array( 0x10, 0x12, 5, 0x11, 0x23, 1, 0x55, 0x43 ); $iv=null; foreach ($ivArray as $element)

我有一个test.php,其中包含以下内容:
echo encrypt("something");

function encrypt($str)
{
        $enc_key = "my key is 8 char long";
        $ivArray=array( 0x10, 0x12, 5, 0x11, 0x23, 1, 0x55, 0x43 );
        $iv=null;
        foreach ($ivArray as $element)
                $iv.=CHR($element);

        return strtoupper(bin2hex(base64_encode(mcrypt_encrypt(MCRYPT_DES, $enc_key, $str, MCRYPT_MODE_CBC, $iv))));
}

那么在我的C#代码上我有:

private static byte[] iv = new byte[] { 0x10, 0x12, 5, 0x11, 0x23, 1, 0x55, 0x43 };

public string ConvertString(string input, string myKey)
{
    try
    {
        input = byteArrayString(input);
        byte[] bytes = Encoding.UTF8.GetBytes(myKey);
        byte[] buffer = Convert.FromBase64String(input);
        DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
        MemoryStream stream = new MemoryStream();
        CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(bytes, iv), CryptoStreamMode.Write);
        stream2.Write(buffer, 0, buffer.Length);
        stream2.FlushFinalBlock();
        return Encoding.UTF8.GetString(stream.ToArray());
    }
    catch
    {
        return string.Empty;
    }
}

private string byteArrayString(string input)
{
    byte[] buffer = new byte[input.Length / 2];
    for (int i = 0; i < input.Length; i += 2)
    {
        if (i < input.Length)
        {
            buffer[i / 2] = (byte)((Uri.FromHex(input[i]) * 0x10) + Uri.FromHex(input[i + 1]));
        }
    }

    return Encoding.UTF8.GetString(buffer);
}

在CodesInChaos帮助下,我用下面php端的代码解决了这个问题,以正确填充它

代码混乱如果你想发布回复,我会将其标记为正确答案,否则我会将其标记为正确答案

$block = mcrypt_get_block_size('des', 'cbc');
$len = strlen($str);
$padding = $block - ($len % $block);
$str .= str_repeat(chr($padding),$padding);

很可能是由不同的填充引起的。@代码混乱是的,但我应该使用哪个填充PKCS7?如果是这样,我也试过了。此代码显然不安全。DES采用56位密钥,因此很容易使用暴力。常量不是正确的IV,它缺少身份验证,@CodesInChaos这不是生产代码,我只是按照要求进行测试。@CodesInChaos如果这有帮助,我不会在C上的加密上使用任何特定的填充,代码只是默认值
DecryptoServiceProvider
带有密钥和IV
$block = mcrypt_get_block_size('des', 'cbc');
$len = strlen($str);
$padding = $block - ($len % $block);
$str .= str_repeat(chr($padding),$padding);