注册
登录

您现在的位置是:首页 > 学无止境

永强教你加解密:对称篇(一)

木木彡82 2019-06-22 14:44:52 0人围观
永强教你加解密:对称篇(一)

转载自:https://segmentfault.com/a/1190000019455770

简单说来呢,加解密技术就是分为两大类:

  • 对称加解密

  • 非对称加解密

其中,常见的对称加解密算法有DES、3DES、AES;而非对称加解密技术比较典型的则是RSA,就是什么公钥私钥证书什么乱七八糟的。

我们先从对称加解密开始,粗暴地说呢,对称加解密就是“加密和解密的时候用同一个密码”,听起来就非常对称,有没有?

用图表达一下就是:

图片描述

最一开始的时候,我朝人民一般都是倾向于使用“天王盖地虎”,“宝塔镇河妖”这种加解密技术;然而,美帝用了一种叫做DES的技术进行对称加解密,这玩意一度成为业界通用的对称加解密技术,银行、五角大楼都爱用这玩意,可惜好景不长、世风日下、世态炎凉,这玩意的破解成本越来越低越来越低~~ 于是,为了续命,就又有一些白胡子老头给DES打补丁,缝缝补补搞出来一个玩意叫做3DES,继续用,又不是不能用…这个顾名思义就行了,别打我,真的:3DES就是用DES处理(注意是处理,我没说是加密)了三次的意思。就目前看来,3DES实际上用的可能也并不是十分广泛了,所以如果大家在选择对称加解密技术的时候,尽量避开DES和3DES就可以了。

呵呵,喜新厌旧的沙雕人类…虽然DES已经没人用了,但毕竟也是辉煌过,我觉得还是得动手表演一波儿。我们知道,在php7里,原来的mcrypt系列加解密已经被放弃掉了,官方建议我们使用openssl系列来进行加解密,所以确保你的PHP环境里安装了openssl标准扩展。

<?php// 这个函数打印出来openssl支持的所有加密方法以及模式的组合$arr_ava_methods = openssl_get_cipher_methods();
print_r( $arr_ava_methods );

文件保存成test.php后,执行一把:php test.php | grep des,结果你们感受一下:

图片描述

其中带有ede的,比如des-ede*这样的就表示是3DES。还有这么多奇奇怪怪的后缀是什么含义?回头再说…又不是不能用。

图片描述

筛选一下,我们看des(非des3)有几种带着尾巴的具体方法:

  • des-cbc

  • des-cfb*(注意后面的通配符星号)

  • des-ecb

  • des-ofb

我们先用传统des方法继续进行装逼表演:

<?php// 我们就选用des-ecb方法进行一次des加密$ava_methods = openssl_get_cipher_methods();
$my_method   = 'des-ecb';if ( !in_array( $my_method, $ava_methods ) ) {  exit( '错误的加密方法'.PHP_EOL );
}
$key  = "123456";
$data = "helloMOTO";echo "明文:".$data.PHP_EOL;
$enc_data  = openssl_encrypt( $data, $my_method, $key );echo "密文:".$enc_data.PHP_EOL;
$dec_data  = openssl_decrypt( $enc_data, $my_method, $key );echo "明文:".$dec_data.PHP_EOL;

保存为test.php执行一把:

图片描述

完美!就像老王的meshbox一样,完美!

简单解析一下:

换个方法继续一下:我们使用openssl_get_cipher_methods()函数获取到可以使用的所有des加密方法,然后简单判断一下我们选用的方法是否在其中;紧接着我们用123456作为密码,helloMOTO作为明文内容,openssl_encrypt()就是加密函数,openssl_decrypt()就是解密函数,具体的函数原型出门左拐查手册,总之一切都是这么的完美!

<?php// 我们就选用des-ecb方法进行一次des加密$ava_methods = openssl_get_cipher_methods();
$my_method   = 'des-cbc';if ( !in_array( $my_method, $ava_methods ) ) {  exit( '错误的加密方法'.PHP_EOL );
}
$key  = "123456";
$data = "helloMOTO";echo "明文:".$data.PHP_EOL;
$enc_data  = openssl_encrypt( $data, $my_method, $key );echo "密文:".$enc_data.PHP_EOL;
$dec_data  = openssl_decrypt( $enc_data, $my_method, $key );echo "明文:".$dec_data.PHP_EOL;

执行一波儿,结果如下图:

图片描述

并不完美,报错了,一个warning级的错误,虽然并不影响加密和解密,但是毕竟是报错了,错误原文我复制粘贴过来,你们感受下:

PHP Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended in /home/ubuntu/lab/test.php on line 10

大概意思就是:用了一个并不推荐而且不安全的空iv在test.php的第十行。我正在翻译的这句的时候,已经精通英语的老李在旁边跟我说“你这翻译也太硬了,要学会人性化,看好了,一看你这就是没上过全日制大学本科的恶果”:

PHP警告:openssl_encrypt():iv向量最好别是空的,不推荐这么用,而且这样并不安全~

什么是iv向量?先抛开这个问题,我先写一段代码,让他能跑起来:

<?php$ava_methods = openssl_get_cipher_methods();
$my_method   = 'des-cbc';if ( !in_array( $my_method, $ava_methods ) ) {  exit( '错误的加密方法'.PHP_EOL );
}// 处理iv向量的两行代码$iv_length = openssl_cipher_iv_length( $my_method );
$iv        = openssl_random_pseudo_bytes( $iv_length );
$key  = "123456";
$data = "helloMOTO";echo "明文:".$data.PHP_EOL;
$enc_data  = openssl_encrypt( $data, $my_method, $key, 0, $iv );echo "密文:".$enc_data.PHP_EOL;
$dec_data  = openssl_decrypt( $enc_data, $my_method, $key, 0, $iv );echo "明文:".$dec_data.PHP_EOL;

注意到8、9、10和15、17两行,均为iv向量做了改动,然后这次代码保存了运行一波儿:

图片描述


文章评论

  • 登录后评论

点击排行