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

你们好,我是永强,就是老李以前常常给大家说的区块链大神、大学肄业却依然大公司iOS主程一波儿流、只生活在老李口中还没有真实露面的骗钱高手、老王的左膀右臂 ——— 赵永强。我和尼古拉斯赵四之间并无什么强关联,我只是单方面认识他而已。php

以前老李企图让我发表一些关于如何进行高端骗工资骗钱的教程,被我义正言辞地拒绝了:css

毕竟是毕生绝学,不能就这么垂手可得地教给大家

不事后面有时间我能够给你们出一些关于“如何在公司混日子还能升职加薪”的入门级教程,传男不传女,独家绝技!敬请期待!html

图片描述

言归正传,那个一直以来我对加解密技术都是耿耿于怀的,由于不少年前有一次面试中被这东西给坑掉了,虽然我后来就本身对加解密中一些本身不懂的地方请教了对方并且他也没有给我讲清楚…面试

事情都过去好几年了,本人自我感受已经必定程度掌握了一些关于加密的高端技术,由于决定出来装一波儿逼,时间比较紧张,我打算赶在2020年农历新年以前把逼装完,大家要注意配合。算法

我知道老李以前在社区发表了一些关于加密啊、解密啊之类的东西,甚至还扯上了什么DH什么ECDH,又是质数又是椭圆曲线,不过这并不与本系列产生冲突,这并不重要,不要在乎这些细节,他那个too young too simple,sometimes naive…编程

这将是一个大概由四篇左右的文章组成的系列文章,因此在正式开始以前,我不得不强调一点 ——— 以下这几门学科的基础理论知识:ubuntu

  • 《离散数学》
  • 《微分与积分》
  • 《空间几何》
  • 《几率论》

你并不须要具有。。。安全

不过你总得知道除了html和css以外的任意一门编程语言。尽管本人精通上到CLanguage下到Perl之类的各类语言,可是本文将采用世界上最好的语言进行一些程序演示,后面老李可能会使用CLanguage和Golang进行其余语言的演示补充。php7

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

  • 对称加解密
  • 非对称加解密

其中,常见的对称加解密算法有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;

注意到八、九、10和1五、17两行,均为iv向量作了改动,而后此次代码保存了运行一波儿:

图片描述

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

那么,在des加解密中,咱们遗留了两个问题:

  • des-cbcdes-cfb等这些后缀是什么意思?
  • iv向量是什么鬼东西?

长按或许有惊喜

图片描述

相关文章
相关标签/搜索