php和.net 进行 encrypt加密,结果不同求解惑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php和.net 进行 encrypt加密,结果不同求解惑相关的知识,希望对你有一定的参考价值。

一个.net的工程师告诉我他的程序是用DESEncrypt加密的,然后给我了一个加密的内容以及秘钥:
秘钥:shihua0316
内容:123456
加密后的结果:46CF42D30FCA204D

然后我使用php的php_mcrypt.dll,php是5.4的版本
加密后的结果:oueYaelcdq8=
解密出来是:123456
代码:
<?php
class DES1
var $key;
function DES1($key)
$this->key = $key;

function encrypt($input)
$size = mcrypt_get_block_size('des', 'ecb');
$input = $this->pkcs5_pad($input, $size);
$key = $this->key;
$td = mcrypt_module_open('des', '', 'ecb', '');
$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
@mcrypt_generic_init($td, $key, $iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$data = base64_encode($data);
return $data;

function decrypt($encrypted)
$encrypted = base64_decode($encrypted);
$key =$this->key;
$td = mcrypt_module_open('des','','ecb','');
//使用MCRYPT_DES算法,cbc模式
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$ks = mcrypt_enc_get_key_size($td);
@mcrypt_generic_init($td, $key, $iv);
//初始处理
$decrypted = mdecrypt_generic($td, $encrypted);
//解密
mcrypt_generic_deinit($td);
//结束
mcrypt_module_close($td);
$y=$this->pkcs5_unpad($decrypted);
return $y;

function pkcs5_pad ($text, $blocksize)
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);

function pkcs5_unpad($text)
$pad = ord($textstrlen($text)-1);
if ($pad > strlen($text))
return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
return false;
return substr($text, 0, -1 * $pad);


$key = "shihua0316";
$input = "123456";
$crypt = new DES1($key);
echo "Encode:".$crypt->encrypt($input)."<br/>";
echo "Decode:".$crypt->decrypt($crypt->encrypt($input));
?>

参考技术A php 的加密结果最后用的是base64编码, .net加密结果是16进制。追问

没明白,能具体点么?是不是指,php的加密结果,显示之前是使用了base64编码之后输出的,.net输出之前是转化成了16进制然后输出的

追答

是这个意思, 先统一,再和.NET人员确认 KEY 和 IV 的值。

PHP数据加密和解密


encrypt.php


&lt;?php        
        /**
        * Passport 加密函数
        *
        * @param                string          等待加密的原字串
        * @param                string          私有密匙(用于解密和加密)
        *
        * @return               string          原字串经过私有密匙加密后的结果
        */
        function passport_encrypt($txt, $key){

                // 使用随机数发生器产生 0~64000 的值并 MD5()

                $encrypt_key = md5(rand(0, 64000));

                // 变量初始化
                $ctr = 0;
                $tmp = ‘‘;

                // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
                for($i = 0; $i &lt; strlen($txt); $i++) {

                        // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零

                        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;

                        // $tmp 字串在末尾增加两位,其第一位内容为 $encrypt_key 的第 $ctr 位,
                        // 第二位内容为 $txt 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1

                        $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
                }

                // 返回结果,结果为 passport_key() 函数返回值的 base64 编码结果

                return base64_encode(passport_key($tmp, $key));
        }
        /**
        * Passport 解密函数
        *
        * @param                string          加密后的字串
        * @param                string          私有密匙(用于解密和加密)
        *
        * @return               string          字串经过私有密匙解密后的结果
        */
        function passport_decrypt($txt, $key) {

                // $txt 的结果为加密后的字串经过 base64 解码,然后与私有密匙一起,
                // 经过 passport_key() 函数处理后的返回值

                $txt = passport_key(base64_decode($txt), $key);

                // 变量初始化
                $tmp = ‘‘;

                // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数

                for ($i = 0; $i &lt; strlen($txt); $i++) {

                        // $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,
                        // 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1

                        $tmp .= $txt[$i] ^ $txt[++$i];
                }
                // 返回 $tmp 的值作为结果

                return $tmp;

        }
        /**
        * Passport 密匙处理函数
        *
        * @param                string          待加密或待解密的字串
        * @param                string          私有密匙(用于解密和加密)
        *
        * @return               string          处理后的密匙
        */
        function passport_key($txt, $encrypt_key) {

                // 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值

                $encrypt_key = md5($encrypt_key);

                // 变量初始化
                $ctr = 0;
                $tmp = ‘‘;

                // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数

                for($i = 0; $i &lt; strlen($txt); $i++) {

                        // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零

                        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;

                        // $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,
                        // 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1

                        $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
                }
                // 返回 $tmp 的值作为结果
                
                return $tmp;
        }
        /**
         * 测试
         */
        $ystr = ‘i love you‘;
        $k = ‘hawk‘;
        $enstr = passport_encrypt($ystr,$k);
        echo passport_decrypt($enstr,$k);

以上是关于php和.net 进行 encrypt加密,结果不同求解惑的主要内容,如果未能解决你的问题,请参考以下文章

PHPmcrypt_encrypt加密函数tip

PHP数据加密和解密

php使用内置的mcrypt_encrypt和mcrypt_decrypt进行字符串加密解密

使用 MCRYPT 在 PHP 中加密/解密...结果不一致

mcrypt_encrypt 不同的结果在 php 和 ios

php7使用openssl_encrypt函数进行AES加密