加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 22:47:30 所属栏目:PHP教程 来源:网络整理
导读:我有一个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
我有一个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,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,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',$padding);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读