永强持续教你加解密对称篇二
永强被吓坏了!因为永强看到了某个微信群有人指出公众号里上篇打酱油附送的那篇文章《震惊!北京一男子竟然用swoole做了这种事!》的内容实在是太low了,这种low文章就不要拿出来发了。 但是给永强留下了面积巨大的心理阴影。他尚未见识过社交网络的恶毒嘴脸。 所以永强本来昨天要发的文章拖到了今天,但是永强实在是怕了,他怕被人喷了被人骂了。虽然我百般鼓励,但他还是心有余悸。尽管我都已经直接告诉他“你那玩意根本就没人看”了,他还是依然不敢发了。然后我不得不摆出PS大法给他做了一张图,他看了看那张图后又收了我6.66元的微信红包,决定继续鼓起勇气发了。 是时候表现一下我的PS精湛技术了! “我们历经千辛万苦,摸打滚爬过数不清的错误,发射了不知道多少枚长征系列,耗费了一代航天人的心血,终于看到了地球与月亮通信的曙光,然后就在五分钟,我们惊讶地发现,原来老王的smartmesh技术早就实现了,甚至连地球文明与外形文明的通信都给出了完美的解决方案…” ——— 尼古拉斯 * 赵永强 众所周知,作为精通各种技术表演的我早就已经不屑于采用ppt的方式吹牛了,一般我都是直接上机操作表演,当然了,程序都是提前写好了的,全是mock的假数据,脚本实现自动化,无论谁来操作都是流畅的,一切都是完美的! 作为一个追求完美的人,我还得继续接着吹上次聊到结尾,好像是遗留了两个问题: ecb、cfb、cbc等这些后缀是什么意思iv向量又是什么意思鉴于DES和3DES已经属于不建议使用的方法了,所以这次我们直接用AES加密进行装逼表演,比如下面这坨代码,你们复制粘贴走运行一下: <?php$ava_methods = openssl_get_cipher_methods();// 选用aes-128-ecb$my_method = 'aes-128-ecb';if ( !in_array( $my_method, $ava_methods ) ) { exit( '错误的加密方法'.PHP_EOL );}// 加密用的密码$key = "1234567812345678";// 加密的内容$data = "12345678abcdxxoo12345678abcdxxoo";$enc_data = openssl_encrypt( $data, $my_method, $key, OPENSSL_RAW_DATA );$hex = bin2hex( $enc_data );echo $hex.' : '.strlen( $hex ).PHP_EOL;我这里运行结果是: c1391e34caf38f8c2a477cbda3772533c1391e34caf38f8c2a477cbda3772533d96aa42b59151a9e9b5925fc9d95adaf : 96分析一下上面代码:这次我们选用的加密方法是AES-128-ECB,这个128是什么意思?128就是密钥长度的意思:128bit;如果你留心的话,还会注意到有aes-192-ecb和aes-256-ecb,其实就是指加密密钥长度为192bit、256bit,然后是值得注意的一个地方是: $enc_data = openssl_encrypt( $data, $my_method, $key, OPENSSL_RAW_DATA );最后一个参数是OPENSSL_RAW_DATA,如果选用这个option的话,经过加密后的数据会是奇怪的二进制数据,无法直接通过文本方式查看,所以要看的话必须先使用bin2hex函数处理一下。 注意了哈,我选的这个密钥1234567812345678是有特殊用意的,这个密钥的长度是16字节也就是128bit,而我们选用的aes加密方法中要求的密钥长度就是128bit,那么我们尝试将密钥增加几位变成:1234567812345678abc,然后其他代码不做任何改动,再次执行加密,结果如下: c1391e34caf38f8c2a477cbda3772533c1391e34caf38f8c2a477cbda3772533d96aa42b59151a9e9b5925fc9d95adaf : 96就是说用“1234567812345678”和“1234567812345678abc”加密后的数据都是一样的。看起来如果我们选用128bit密钥长度的话,一旦密钥长度超过128bit后面多余的部分会被直接无视掉~~~ ...