Aes加密类程序代码分享,对称加密

PHP7.1中使用openssl替换mcrypt

在php开发中,使用mcrypt相关函数能够很便利地进行AES加、解密操作,可是PHP7.第11中学废弃了mcrypt扩展,所以必需寻找另一种实现。在搬迁手册中曾经提出了用openssl代替mcrypt,但未提交具体示例。网上有广大演示,能够替换大多数风貌,但对于里边细节却从未证实。同样,不难地选拔网上示例在某种代码场景下有可能导致代码替换前后的包容难题,以下则来谈谈具体代码及原因。

率先大家直接提交替换的代码,再从代码中剖析难点。(本文中剖析的算法是AES-128-CBC)

在php开发中,使用mcrypt相关函数能够很有益于地开始展览AES加、解密操作,但是PHP7.第11中学丢掉了mcrypt扩充,所以必需寻找另一种达成。在搬迁手册中曾经建议了用openssl代替mcrypt,但未提交具体示例。网上有许多示范,能够轮换大多数情景,但对于内部细节却绝非表达。同样,简单地运用网上示例在某种代码场景下有大概引致代码替换前后的包容难题,以下则来研究具体代码及原因。

PHP 在进入7.x 时日后,默许就不再附带 mcrypt 扩展,mcrypt 将被
openssl_* 一族函数所取代。所以,对于 PHPer 来说,有供给学习一下
PHP 的 OpenSSL 增加。

AES加密算法 – 算法原理

轮换示例

示例会呈现三种mcrypt的行使办法,主要在于填充不一样(在下文子禽解释填充)。在全体加、解密进度中,完整程度高级中学一年级点代码则会自主达成填充、移除填充,简单一点代码会间接忽略填充,但三种方法均可寻常运作;在事实上开销中(7.1事先版本),提议加上填充。请看如下具体示例:

  1. mcrypt未利用填充

    • mcrypt加密:

        $key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
        $iv = 'aaaaaaaaaaaaaaaa';
        $data = 'dataString';
      
        $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
        mcrypt_generic_init($cipher, $key, $iv);
        $cipherText256 = mcrypt_generic($cipher, $data);
        mcrypt_generic_deinit($cipher);
      
        return bin2hex($cipherText256);
      
    • 同样成效的openssl加密代码:

        $key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
        $iv = 'aaaaaaaaaaaaaaaa';
        $data = 'dataString';
      
        $data = $data . str_repeat("\x00", 16 - (strlen($data) % 16)); // 双引号可以解析asc-ii码\x00
      
        return bin2hex(openssl_encrypt($data, "AES-256-CBC", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv));
      
  2. mcrypt使用填充

    • mcrypt加密:

        $key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
        $iv = 'aaaaaaaaaaaaaaaa';
        $data = 'dataString';
      
        // 填充(移除填充反着移除即可)
        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
      
        $pad = $block - (strlen($data) % $block);
        if ($pad <= $block) {
            $char = chr($pad);
            $data .= str_repeat($char, $pad);
        }
      
        $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
        mcrypt_generic_init($cipher, $key, $iv);
        $cipherText256 = mcrypt_generic($cipher, $data);
        mcrypt_generic_deinit($cipher);
      
        return bin2hex($cipherText256);
      
    • 一律效果的openssl加密代码:

        $key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
        $iv = 'aaaaaaaaaaaaaaaa';
        $data = 'dataString';
      
        return bin2hex(openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv));
      

上述示例均可成功运营,个中第三个示范(未利用填充,但在openssl中开始展览了填充)和第1个示范(使用填充,在openssl中未使用填充)在轮换前后输出相同,并无包容难题。我们能够根据代码不一致的填写情势来抉择分裂的交替方案,但中间有四个细节必要注解

  1. 干什么要有填充?
  2. 用openssl替换后算法的称号为什么区别?

接下去会则会具体分析 填充算法

第3大家一直提交替换的代码,再从代码中分析难题。(本文中剖析的算法是AES-128-CBC)

正文就先从 OpenSSL
扩充中的对称加密说起。前面会陆续越多非对称加密、数字签名、数字证书等函数的授课。

AES
算法基于排列和置换运算。排列是对数码再度开始展览配备,置换是将1个数据单元替换为另二个。AES
使用三种分化的情势来实施排列和置换运算。
AES 是2个迭代的、对称密钥分组的密码,它能够选择12捌 、192 和 25十一个人密钥,并且用 12九位(16字节)分组加密和平解决密数据。与公共密钥密码使用密钥对两样,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码重回的加密数据的位数与输入数据一致。迭代加密应用三个循环结构,在该循环中重复置换和替换输入数据。

填充

为什么有填充则要从加密的算法说起。因为在AES-128-CBC算法中,会把要加密的字符串以每15个byte的长度进行分层,稳步总结,因此导致不足16byte的段则会议及展览开填空。所以给出的示范中会有二种:一种是选拔暗许的填充,另一种是自立填充。在与openssl的交替中,怎样抉择填充方案,则需求对mcrypt与openssl针对默许与独立填充有所领会。

  • mcrypt暗中同意填充

    在php的源码中,能够见见暗中认可会以\x00进展填充,事实上,并非是以\x00展开填充,从源码中得以窥见,首先申请了一个15位的空字符串,所以发轫化时每位字节均为\x00,
    实际上能够说里面并不曾填写,只是它自然正是\x00
    ,使用默许填充得到的加密字符串会是之类格局:
    亚洲必赢官网 1

    由此解密时则要移除多余的\x00。当然也能够懒一点,不移除\x00
    因为在php中字符串”string\x00″与字符串”string”除了长度不等同外,其余表现均一致,所以看起来并无差别,如下代码:

       // 尾部包含若干个`\x00` 均可功输出true
       if ("string\x00" == "string") { // 用双引号可解析\x00
           echo true;
       }
    

    \x00填充后的示范:(请小心字符串的长短,总而言之用\x00填充会影响长度)
    亚洲必赢官网 2

  • mcrypt自主填充

    填充算法需以如下算法实行:

    • 到场填充

        /**
         * 填充算法
         * @param string $source
         * @return string
         */
        function addPKCS7Padding($source)
        {
            $source = trim($source);
            $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
      
            $pad = $block - (strlen($source) % $block);
            if ($pad <= $block) {
                $char = chr($pad);
                $source .= str_repeat($char, $pad);
            }
            return $source;
        }
      

      进入填充后字符串实际上如下情势:
      亚洲必赢官网 3

    • 移除填充

        /**
         * 移去填充算法
         * @param string $source
         * @return string
         */
        function stripPKSC7Padding($source)
        {
            $source = trim($source);
            $char = substr($source, -1);
            $num = ord($char);
            if ($num == 62) return $source;
            $source = substr($source, 0, -$num);
            return $source;
        }
      
  • openssl暗许填充

    其默许方式与正式的mcrypt的独立填充格局一样,所以在第一个示范中,对于利用了上述的填写算法后,
    可径直行使openssl_encrypt替换,不会发生包容难点。填充后的加密字符串如下情势:

    亚洲必赢官网 4

    需注意的是在openssl_encryptopenssl_decrypt中放置了填充与移除填充,所以一直利用即可,除非需自主完毕填充,不然不供给考虑填充

  • Aes加密类程序代码分享,对称加密。openssl自主填充

    openssl_encrypt提供了option参数以帮助自主填充,但在翻看php源码中openssl的测试用例代码才找到正确用法:

       // if we want to manage our own padding
      $padded_data = $data . str_repeat(' ', 16 - (strlen($data) % 16));
      $encrypted = openssl_encrypt($padded_data, $method,     $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
      $output = openssl_decrypt($encrypted, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
      var_dump(rtrim($output));
    

    (备注:如上,OPENSSL_ZERO_PADDING 并非是为0填充的趣味)
    透过,我们就能够分解,在率先个示范中openssl_encrypt从前加入了自立点充\x00的代码原因了

从上述的加、解密针对填充逻辑不一样,针对上文中的示例能够很好地表明:

  • 示例1:
    mcrypt加密时未选取填充,故以\x00拓展了填充,所以在轮换到openssl,须要自主完结\x00填充。

  • 示例2:
    mcrypt加密时选择了标准的填写,同时openssl的填写方式也为标准填充,故间接运用即可。

浅析到那,能够发现,无论是何种填充策略都需注意在加密时加入填充,在解密时则必须求移除填充。至此,上文中示例中的填充相关则分析到位了,接下去大家再看看哪些挑选替换后的算法。

轮换示例

PHP 的 OpenSSL 扩充中,对称加密的连带函数有:

 代码如下

慎选算法

在上述的以身作则中,有一个标题在于,mcrypt中的AES-128-CBC算法,在openssl中怎么替换来了AES_256?
至于这或多或少,
小编也未找到合理的表明,查看源码近来半会也没找到原因(能力简单~),但透过以下资料,依然成功了遵循

  • openssl 解密 mcrypt AES
    数据不包容难题
  • Convert mcrypt_generic to openssl_encrypt Ask
    Question

一旦有同学找到原因,欢迎给本身留言,多谢。

示例会显示三种mcrypt的运用方法,主要在于填充不一样(在下文少禽解释填充)。在全路加、解密进度中,完整程度高一点代码则会自主落成填充、移除填充,不难一点代码会一向忽略填充,但两种艺术均可符合规律运作;在实质上费用中(7.1事先版本),提议加上填充。请看如下具体示例:

  • openssl_encrypt()
  • openssl_decrypt()
  • openssl_random_pseudo_bytes()
  • openssl_get_cipher_methods()
  • openssl_cipher_iv_length()

<?php
/**
* php AES加解密类
* 因为java只支持128位加密,所以php也用128位加密,可以与java互转。
*
同时AES的规范也是1二十六人。只是OdysseyIJNDAEL算法可以支撑128,192和255人加密。
*
* @author Terry
*
*/
class PhpAes
{
/**
* This was AES-128 / CBC / ZeroBytePadding encrypted.
* return base64_encode string
* @author Terry
* @param string $plaintext
* @param string $key
*/
public static function AesEncrypt($plaintext,$key = null)
{
if ($plaintext == ”) return ”;
if(!extension_loaded(‘mcrypt’))
throw new CException(Yii::t(‘yii’,’AesEncrypt requires PHP mcrypt
extension to be loaded in order to use data encryption feature.’));
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128,
MCRYPT_MODE_CBC);
$plaintext = self::PKCS5Padding($plaintext, $size);
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, ”,
MCRYPT_MODE_CBC, ”);
$key=self::substr($key===null ?
Yii::app()->params[‘encryptKey’] : $key, 0,
mcrypt_enc_get_key_size($module));
/* Create the IV and determine the keysize length, use MCRYPT_RAND
* on Windows instead */
$iv = substr(md5($key),0,mcrypt_enc_get_iv_size($module));
/* Intialize encryption */
mcrypt_generic_init($module, $key, $iv);

总结

对于利用mcrypt AES 进行加密密的某些,假如在轮换进程中难点,
能够从算法替换或填充那两下边开首考虑下。同时依旧一务必满意的条件是依据差异的填充方式选用,
替换最关键的即将考虑包容难题,有限帮忙轮换后不发出别的变动
固然只是只是有细微的差别—-底部多少个字符串的不比,但一旦在多平马赛并且实行修改也是一件麻烦事,但改变越少危害越小。

正文只是针对性AES算法举行了简便表达,对于任何算法是还是不是适用还有待商讨。

mcrypt未选用填充

光看PHP的法定文书档案还有点难驾驭。上一段代码,更清楚地看下那几个函数怎么达成加密的:

/* Encrypt data */
$encrypted = mcrypt_generic($module, $plaintext);

参考资料

PHP 7.1.x 中丢掉的本性:

mcrypt扩张舍弃:
AES算法:
mcrypt源码:
openssl扩大原码:
openssl 解密 mcrypt AES
数据不包容难题:
Convert mcrypt_generic to openssl_encrypt Ask
Question:

  • 作者: 给个理由先
  • 本文地址:
  • 转发请评释出处

mcrypt加密:

// 加密算法
1. $encryptMethod = 'aes-256-cbc';
// 明文数据
2. $data = 'Hello World';

// 生成IV
3. $ivLength = openssl_cipher_iv_length($encryptMethod);
4. $iv = openssl_random_pseudo_bytes($ivLength, $isStrong);
5. if (false === $iv && false === $isStrong) {
6.     die('IV generate failed');
7. }

// 加密
8. $encrypted = openssl_encrypt($data, $encryptMethod, 'secret', 0, $iv);
// 解密
9. $decrypted = openssl_decrypt($encrypted, $encryptMethod, 'secret', 0, $iv);

/* Terminate encryption handler */
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return base64_encode(trim($encrypted));
}

 $key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
 $iv = 'aaaaaaaaaaaaaaaa';
 $data = 'dataString';
 $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
 mcrypt_generic_init($cipher, $key, $iv);
 $cipherText256 = mcrypt_generic($cipher, $data);
 mcrypt_generic_deinit($cipher);
 return bin2hex($cipherText256);

详见解释一下:

/**
* This was AES-128 / CBC / ZeroBytePadding decrypted.
* @author Terry
* @param string $encrypted base64_encode encrypted string
* @param string $key
* @throws CException
* @return string
*/
public static function AesDecrypt($encrypted, $key = null)
{
if ($encrypted == ”) return ”;
if(!extension_loaded(‘mcrypt’))
throw new CException(Yii::t(‘yii’,’AesDecrypt requires PHP mcrypt
extension to be loaded in order to use data encryption feature.’));

同样效果的openssl加密代码:

第 1 行 钦点了加密算法。比如那段代码应用 aes-256-cbc
算法加密。其实PHP的OpenSSL扩大支持很多样加密算法,想领聚会场全部对称加密算法名称列表,能够调用
openssl_get_cipher_methods() 函数,那会回去多少个数组:

$ciphertext_dec = base64_decode($encrypted);
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, ”,
MCRYPT_MODE_CBC, ”);
$key=self::substr($key===null ? Yii::app()->params[‘encryptKey’] :
$key, 0, mcrypt_enc_get_key_size($module));

 $key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
 $iv = 'aaaaaaaaaaaaaaaa';
 $data = 'dataString';


 $data = $data . str_repeat("\x00", 16 - (strlen($data) % 16)); // 双引号可以解析asc-ii码\x00
 return bin2hex(openssl_encrypt($data, "AES-256-CBC", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv));
array(
  0 => 'AES-128-CBC',
  1 => 'AES-128-CBC-HMAC-SHA1',
  ...
  7 => 'AES-128-ECB',
  ...
  31 => 'BF-CBC',
  200 => 'seed-ofb',
)

$iv = substr(md5($key),0,mcrypt_enc_get_iv_size($module));

mcrypt使用填充

你会发现函数重临将近200种加密算法,实际上没有如此多,许多只是因为大小写差异而再一次了,比如
AES-128-CBCaes-128-cbc
实际上是同样种加密算法。倘诺去掉重复项,那么 PHP 的 OpenSSL
扩大支持大概100各个不相同的加密算法。

/* Initialize encryption module for decryption */
mcrypt_generic_init($module, $key, $iv);

mcrypt加密:

第 3 ~ 7 行 生成了 IV。为何要生成 IV,这几个 IV 有怎么着用?

/* Decrypt encrypted string */
$decrypted = mdecrypt_generic($module, $ciphertext_dec);

$key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
 $iv = 'aaaaaaaaaaaaaaaa';
 $data = 'dataString';
 // 填充(移除填充反着移除即可)
 $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
 $pad = $block - (strlen($data) % $block);
 if ($pad <= $block) {
 $char = chr($pad);
 $data .= str_repeat($char, $pad);
 }
 $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
 mcrypt_generic_init($cipher, $key, $iv);
 $cipherText256 = mcrypt_generic($cipher, $data);
 mcrypt_generic_deinit($cipher);
 return bin2hex($cipherText256);

抚今追昔一下 openssl_get_cipher_methods()
再次来到的加密算法列表,有好多名字中间含有 “CBC”
字样,这几个加密算法使用了一样种加密形式,也正是
密码分组链接形式(Cipher Block Chaining)

/* Terminate decryption handle and close module */
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return self::UnPKCS5Padding($decrypted);
}

平等成效的openssl加密代码:

CBC
情势的加密算法中,明文仲被分为若干个组,以组为单位加密。每一个组的加密进度,正视他前二个组的多寡:要求前边一组的数据进行异或操作后生开支组的密文。那么最早先的丰富组又要依赖哪个人吗?信赖的正是IV,所以那正是怎么 IV 要叫初步化向量。IV
伊始化向量(initialization vector)的缩写

private static function strlen($string)
{
return extension_loaded(‘mbstring’) ? mb_strlen($string,’8bit’) :
strlen($string);
}

 $key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; 
 $iv = 'aaaaaaaaaaaaaaaa';
 $data = 'dataString';  
return bin2hex(openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv));

IV 应该是随机生成的,所以代码应用了 openssl_random_pseudo_bytes()
生成 IV。该函数收取一个 int,代表必要变更的 IV 的长短。

private static function substr($string,$start,$length)
{
return extension_loaded(‘mbstring’) ?
mb_substr($string,$start,$length,’8bit’) :
substr($string,$start,$length);
}

以上示例均可成功运维,个中第3个示范(未采用填充,但在openssl中展开了填充)和第3个示范(使用填充,在openssl中未利用填充)在轮换前后输出相同,并无包容难题。大家可以依照代码差别的填充格局来摘取分裂的轮换方案,但里边有多个细节须求证实

IV 长度随加密算法不相同而各异。一般人是记不住那么多算法必要的 IV
长度的。所以一向动用 openssl_cipher_iv_length() 函数,那么些函数再次回到1个
int,表示加密算法要求的 IV 长度:

private static function PKCS5Padding ($text, $blocksize) {
$pad = $blocksize – (self::strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}

缘何要有填充?

echo openssl_cipher_iv_length('AES-256-CBC'); // 16
echo openssl_cipher_iv_length('BC-CBC'); // 8
echo openssl_cipher_iv_length('AES-128-ECB'); // 0

private static function UnPKCS5Padding($text)
{
$pad = ord($text{self::strlen($text)-1});
if ($pad > self::strlen($text)) return false;
if (strspn($text, chr($pad), self::strlen($text) – $pad) != $pad) return
false;
return substr($text, 0, -1 * $pad);
}
}

亚洲必赢官网 ,用openssl替换后算法的名号为什么不相同?
接下去会则会具体分析 填充 、算法。

比如 AES-256-CBC 须求十几位的 IV、 BC-CBC 要求 8 位的 IV、而AES-128-ECB
不要求 IV,所以回来了 0。

应用方式

填充

第 8 ~ 9 行 是加密和平解决密。分别选用了 openssl_encrypt()
openssl_decrypt()

 代码如下

为啥有填充则要从加密的算法说起。因为在AES-128-CBC算法中,会把要加密的字符串以每1多少个byte的尺寸实行分层,稳步总结,因而造成不足16byte的段则会进展填写。所以给出的言传身教中会有二种:一种是应用暗许的填充,另一种是自主填充。在与openssl的轮换中,怎么样抉择填充方案,则须要对mcrypt与openssl针对暗中同意与独立填充有所精通。

  • 第①个参数是输入,对 openssl_encrypt() 来说是明文串,对
    openssl_decrypt() 来说是密文串
  • 其次个参数是点名加密 / 解密 算法
  • 其多少个参数是加密 / 解密时要求动用的密码,是个字符串
  • 第七个参数额外选项,没有特殊须求能够保险默许值:0,
  • 第五个参数是 IV

<?php
require_once(‘./AES.php’);
//$aes = new AES();
$aes = new AES(true);// 把加密后的字符串按十六进制进行仓库储存
//$aes = new AES(true,true);// 带有调试消息且加密字符串按十六进制存款和储蓄
$key = “this is a 32 byte key”;// 密钥
$keys = $aes->makeKey($key);
$encode = “123456”;// 被加密的字符串
$ct = $aes->encryptString($encode, $keys);
echo “encode = “.$ct.”<br>”;
$cpt = $aes->decryptString($ct, $keys);
echo “decode = “.$cpt;
?>

mcrypt暗中同意填充

那三个函数除了第2个参数不一致,别的参数都要保管同一才能如愿以偿解密。最后,在行使须要
IV 的加密算法时,要求留意:

在php的源码中,能够观望暗中认可会以\x00进行填充,事实上,并非是以\x00进行填充,从源码中能够窥见,首先申请了叁个十三个人的空字符串,所以初阶化时每位字节均为\x00,
实际上能够说内部并从未填写,只是它自然便是\x00
,使用暗许填充获得的加密字符串会是之类方式:

  • 必须传 $iv 参数,不传的话PHP将会抛出3个 Warning
  • IV 应该是随机生成的(比如用 openssl_random_pseudo_bytes()
    ),不能够人为设定
  • 每便加密都应该再一次生成2遍 IV ,不可偷懒数十次加密应用相同 IV
  • IV
    要一气浑成密文一起保存(不然就无奈解密了啦),能够一向附在密文串前边,也足以分别保存

亚洲必赢官网 5

mcrypt暗许填充

于是解密时则要移除多余的\x00。当然也能够懒一点,不移除\x00。
因为在php中字符串”string\x00″与字符串”string”除了长度不均等外,其余表现均一致,所以看起来并无分化,如下代码:

 // 尾部包含若干个`\x00` 均可功输出true
 if ("string\x00" == "string") { // 用双引号可解析\x00
 echo true;
 }

\x00填充后的示范:(请留心字符串的长短,同理可得用\x00填充会影响长度)

亚洲必赢官网 6

mcrypt自主填充

填充算法需以如下算法进行:

插手填充

/**
 * 填充算法
 * @param string $source
 * @return string
 */
 function addPKCS7Padding($source)
 {
 $source = trim($source);
 $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

 $pad = $block - (strlen($source) % $block);
 if ($pad <= $block) {
  $char = chr($pad);
  $source .= str_repeat($char, $pad);
 }
 return $source;
 }

投入填充后字符串实际上如下方式:

亚洲必赢官网 7

移除填充

 /**
 * 移去填充算法
 * @param string $source
 * @return string
 */
 function stripPKSC7Padding($source)
 {
 $source = trim($source);
 $char = substr($source, -1);
 $num = ord($char);
 if ($num == 62) return $source;
 $source = substr($source, 0, -$num);
 return $source;
 }

openssl暗中认可填充

其暗许形式与正统的mcrypt的独立填充方式同样,所以在其次个示范中,对于利用了以上的填写算法后,
可平昔运用openssl_encrypt替换,不会产生包容难题。填充后的加密字符串如下方式:

亚洲必赢官网 8

需注意的是在openssl_encrypt与openssl_decrypt中置放了填充与移除填充,所以平昔使用即可,除非需自主完成填充,不然不需求考虑填充

openssl自主填充

openssl_encrypt提供了option参数以支持自主填充,但在查阅php源码中openssl的测试用例代码才找到科学用法:

 // if we want to manage our own padding
 $padded_data = $data . str_repeat(' ', 16 - (strlen($data) % 16));
 $encrypted = openssl_encrypt($padded_data, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
 $output = openssl_decrypt($encrypted, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
 var_dump(rtrim($output));
(备注:如上,OPENSSL_ZERO_PADDING 并非是为0填充的意思)

经过,大家就能够分解,在率先个示范中openssl_encrypt以前插手了自立点充\x00的代码原因了

从上述的加、解密针对填充逻辑不一样,针对上文中的示例能够很好地诠释:

示例1:

mcrypt加密时未使用填充,故以\x00实行了填充,所以在轮换来openssl,须求自主实现\x00填充。

示例2:

mcrypt加密时采纳了行业内部的填写,同时openssl的填写方式也为行业内部填充,故直接动用即可。

剖析到这,能够发现,无论是何种填充策略都需注意在加密时进入填充,在解密时则必须求移除填充。至此,上文中示例中的填充相关则分析形成了,接下去我们再看看怎么样抉择替换后的算法。

挑选算法

在以上的示范中,有3个题材在于,mcrypt中的AES-128-CBC算法,在openssl中怎么替换来了AES_256?
有关那或多或少,
小编也未找到合理的分解,查看源码一时半会也没找到原因(能力不难~),但经过以下资料,依旧落成了效益

openssl 解密 mcrypt AES
数据不包容难点

Convert mcrypt_generic to openssl_encrypt Ask
Question

若果有同学找到原因,欢迎给自家留言,多谢。

总结

对此利用mcrypt AES 进行加密密的某些,如果在轮换进度中难题,
能够从算法替换或填充那两上边初始考虑下。同时还是一必须知足的条件是依照差别的填充情势采纳,
替换最关键的即将考虑包容难题,有限帮助替换后不发出任何改动。
即便只是只是有一线的差异—-底部多少个字符串的不一致,但一旦在多平埃德蒙顿而且展开修改也是一件小事,但改变越少危机越小。

本文只是本着AES算法实行了归纳表达,对于其余算法是还是不是适用还有待研商。

上述所述是小编给大家介绍的PHP7.第11中学选取openssl替换mcrypt的实例详解,希望对大家有所援助,假诺我们有别的疑问请给自家留言,小编会及时回复我们的。在此也非凡多谢大家对台本之家网站的支撑!

您大概感兴趣的稿子:

  • 升高 PHP7.1 后 openssl 解密 mcrypt AES
    数据不包容难点的拍卖措施
  • PHP 使用openssl
    扩大实现公钥加密的章程
  • php无需编写翻译安装openssl扩张的落实格局
  • linux环境下安装PHP的OpenSSL扩展的方法讲解
  • php7安装openssl扩大方法
  • PHP中OpenSSL加密难题整治
  • PHP
    7.第11中学使用OpenSSL代替Mcrypt加解密的措施详解
  • PHP中利用OpenSSL生成证书及加密解密
  • 详解PHP版本包容之openssl调用参数
网站地图xml地图