永强持续教你加解密对称篇二

永强被吓坏了!因为永强看到了某个微信群有人指出公众号里上篇打酱油附送的那篇文章《震惊!北京一男子竟然用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后面多余的部分会被直接无视掉~~~ ...

June 18, 2019 · 1 min · jiezi

永强教你加解密对称篇一

大家好,我是永强,就是老李之前经常给你们说的区块链大神、大学肄业却依然大公司iOS主程一波儿流、只生活在老李口中尚未真实露面的骗钱高手、老王的左膀右臂 ——— 赵永强。我和尼古拉斯赵四之间并没有什么强关联,我只是单方面认识他而已。 之前老李企图让我发表一些关于如何进行高端骗工资骗钱的教程,被我义正言辞地拒绝了: 毕竟是毕生绝学,不能就这么轻而易举地教给你们不过后面有时间我可以给大家出一些关于“如何在公司混日子还能升职加薪”的入门级教程,传男不传女,独家绝技!敬请期待! 言归正传,那个一直以来我对加解密技术都是耿耿于怀的,因为很多年前有一次面试中被这东西给坑掉了,虽然我后来就自己对加解密中一些自己不懂的地方请教了对方而且他也没有给我讲清楚… 事情都过去好几年了,本人自我感觉已经一定程度掌握了一些关于加密的高端技术,因为决定出来装一波儿逼,时间比较紧张,我打算赶在2020年农历新年之前把逼装完,你们要注意配合。 我知道老李之前在社区发表了一些关于加密啊、解密啊之类的东西,甚至还扯上了什么DH什么ECDH,又是质数又是椭圆曲线,不过这并不与本系列产生冲突,这并不重要,不要在意这些细节,他那个too young too simple,sometimes naive… 这将是一个大概由四篇左右的文章组成的系列文章,所以在正式开始之前,我不得不强调一点 ——— 如下这几门学科的基础理论知识: 《离散数学》《微分与积分》《空间几何》《概率论》你并不需要具备。。。 不过你总得知道除了html和css之外的任意一门编程语言。尽管本人精通上到CLanguage下到Perl之类的各种语言,但是本文将采用世界上最好的语言进行一些程序演示,后面老李可能会使用CLanguage和Golang进行其他语言的演示补充。 简单说来呢,加解密技术就是分为两大类: 对称加解密非对称加解密其中,常见的对称加解密算法有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-cbcdes-cfb*(注意后面的通配符星号)des-ecbdes-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执行一把: ...

June 12, 2019 · 1 min · jiezi

关于PHP加解密的懒汉入门篇API安全加强篇一

懒汉入门这两点就足以说明这篇文章不想要着有什么高端大气的技术内容,我跟你讲,全是水。不可能有什么质数素数、椭圆曲线加密、迪菲-赫尔曼什么的,不可能有的。 首先我不懂,其次,反正你们也不懂。 不过这里还是要先说一点儿,就是很多泥腿子一直拿md5当加密算法来看待,但实际上md5是一种信息摘要算法(其实就是哈希),不是加密算法,因为md5不可逆,但是加解密是一个可逆的过程,所以以后这种低级错误还是不要犯的为好。 加密技术一直是技术圈中的一个独特领域和分支,其一些原理并不是随随便便就可以理解的来的。如果没有良好的数学底子,怕是很难研究下去。但是,作为一篇水文,不研究原理,仅仅来用一用来实践一把,还是没什么大问题的。 加密分为两大类: 对称加密,常见算法有DES、3DES、AES等等,据说AES是比较屌的最新最常用的算法非对称加密,RSA、DSA、ECDH等等对称加密用粗话说就是用同一个密钥对信息加解密。比如元首要操作东线战场了,给古德里安发了一段电报,大概意思就是“你给我闪开,让我操作!立马南下打基辅!”,但是元首又怕朱可夫给看到这段消息,于是元首就用了一个强壮的密钥123456来加密这段话,然后这段话就变成akjdslfjalwjglajwg了。古德里安收到这坨乱七八糟的玩意后,用123456来解密一下,得到明文“你给我闪开,让我操作!立马南下打基辅!”,然而朱可夫由于抓破脑壳也想不到这个超级密钥123456,所以朱可夫注定一脸懵逼,最终导致基辅60万苏军被奸!但是这里面有一个问题就是元首是如何告诉古德里安私钥是123456的。 两个人提前就商量好了,1941年6月22日的前一天偷偷商量好了。。。两个人不是提前商量好的,而是古德里安到东线后,元首通过打电话、发电报、QQ、微信。。。 。。。对于朱可夫来说,如果对方采用了方案1,那么他也没啥好办法,只能等潜伏在古德里安身边的特工卧底返回123456。由于密钥被暴露了,所以必须换新的密钥,元首这会儿只能走途径2告诉古德里安新的密钥,这会儿逗逼的事情来了,如何对密钥进行加密。答案是不能,此时问题陷入到欲要加密,必先加密的矛盾中。所以,这个密钥是注定要通过明文传输了,只要是明文传输,朱可夫就一定有机会把密钥搞到手。 非对称加密就是解决这个难题而生。密钥换来换去还想不暴露,扯犊子。还是元首和古德里安,这会儿他俩分别生成一对自己的公钥和私钥。这里需要强调的是: 公钥和私钥是成双成对生成的,二者之间通过某种神秘的数学原理连接着,具体是啥,我也不知道公钥加密的数据,只能通过相应的私钥解密;私钥加密的数据,只能通过对应的公钥解密公钥可以颁发给任何人,然而私钥你自己偷偷摸摸藏到自己裤裆里,别弄丢了这会儿就简单了,元首把自己公钥给古德里安,然后古德里安把自己公钥给元首,然后都偷偷摸摸保存好自己的私钥。有一天,元首告诉古德里安“你丫别干了,天天不听我操作!”,然后用古德里安颁发的公钥加密好了,然后让空军到东线直接仍传单,扔的满地都是,古德里安看到后从裤裆里拿出自己的私钥解密,然后就立马请假回家休息了,回去前用元首的公钥加密了如下消息“傻逼,老子还不伺候了!”,然后让空军回去撒了柏林一地,元首看到后从裤裆里拿出自己的私钥一解密:“卧槽。。。”。虽然这双方都是大大咧咧的发传单,但是朱可夫只能在旁边一脸懵逼、生无可恋。因为用于解密的私钥从来不会在外流通,所以,泄露的可能性是0。 但是,有一点是值得说明,那就是无论是对称加密还是非对称加密,都顶不住用机器是强行暴力猜解私钥。一年不行两年,两年不行二十年,二十年不行一百年,总是能猜出来的,这是没有办法的一件事情。大家可以搜一搜关于768bit RSA被KO的事件,是吧。 下面我们从gayhub上扒了一个对称加密的库下来,尝试一把aes对称加密算法,地址如下: https://github.com/ivantcholakov/gibberish-aes-php直接git clone到目录中,然后测试代码如下: <?phprequire 'GibberishAES.php';$pass = '123456';$string = '你好,古德里安,我是希特勒,你赶紧给我滚回来...';GibberishAES::size(256);$encrypted_string = GibberishAES::enc( $string, $pass );$decrypted_string = GibberishAES::dec( $encrypted_string, $pass );echo PHP_EOL."加密后的:".$encrypted_string.PHP_EOL;echo "解密后的:".$decrypted_string.PHP_EOL.PHP_EOL;保存为test.php,运行一下结果如下: 然后我们将上面代码反复运行100,000次,看看耗费多长时间: require 'GibberishAES.php';$pass = '123456';$string = '你好,古德里安,我是希特勒,你赶紧给我滚回来...';GibberishAES::size(256);$start_time = microtime( true );for( $i = 1; $i <= 100000; $i++ ) { $encrypted_string = GibberishAES::enc( $string, $pass ); $decrypted_string = GibberishAES::dec( $encrypted_string, $pass );}$end_time = microtime( true );echo "一共耗时:".( $end_time - $start_time ).PHP_EOL;保存为test.php,运行一下结果如下: ...

April 24, 2019 · 1 min · jiezi