c# - 在 PHP 上加密但无法在 C# 上解密

标签 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)
                $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);
}

如果我在 C# 上完成这一切,那么从 PHP 到 C# 的区别在于 PHP 生成的加密有 12 个字节。

我在 PHP 端做错了什么来匹配加密?


更新(PKCS7):

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

最佳答案

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

CodesInChaos 如果您想发布回复,我会将其标记为正确答案,否则我将标记为这个。

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

关于c# - 在 PHP 上加密但无法在 C# 上解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14854133/

相关文章:

php - simplexml,返回具有相同标签的多个项目

php - 分离 PHP 和 HTML

mysql - 将方法名称绑定(bind)到 mysql where 子句?

java - 如何使用字节数组作为键对字符串进行异或?

c# - 在 ASP.NET 中使用 HTTP 处理程序生成要在电子邮件中显示的图像

c# - 如何将变量定义为方法?

php - React Fetch 到 Laravel API 创建新 session

python - 如何为WhatsApp .crypt12格式生成页眉和页脚?

javascript - HTML1527 : DOCTYPE expected. 最短的有效文档类型是 "&lt;!DOCTYPE html>"

c# - MySql查询不显示结果