动态加密的实现算法
常见的加密算法,只要明文固定,秘钥固定,那么加密结果也是固定。于是这就产生了碰撞的可能性,为穷举破解提供了机会。那么有没有可能设计一种算法,使得在相同明文与秘钥的前提下,每次加密的结果都不一样呢?
看起来似乎有点不太可能,但是我们如果换个思路:明文打乱后再加密;加密的时候带上时间因子。有了这两个相对比较“随机”的因素,那么加密的结果就有可能达到上述目的。理想很丰满,现实很骨感。虽然思路有了,但是怎么打乱明文?总不能写死(固定把XX字节挪动到YY位置)吧,这跟不打乱没有本质上的区别。所以,又回到时间这个因子上面来。有一个假设是成立的:每次需要加密的时间点是不同的(杠精免疫),so...用时间因子与密文的hash值,可以构造出一个比较“随机”的打乱方式。其次,有个常识:Base64变化后,字符串长度会变成原来的1.3倍左右(每3个字节变成4个字节,例如:9个字节长度的字符串,base64变换后,会变成12个字节;10个字节的字符串,会变成15个字节)。现在万事俱备只欠东风。
话不多说,上菜:这是我在2016年的时候,在某500强企业撸的代码...因为APP鉴权的秘钥固定,送检时总是被安全部门打回,被逼无奈连夜撸的代码,这回安全部门傻眼了。搬砖佬从此在某500强企业的某项目组中一战成名。如今项目已经过了保密期,所以搬砖佬才敢把源码与算法设计思想共享出来...
加解密算法,包括PHP、JAVA、Objective-C三种语言的算法实现以及Demo,可以用于APP与WEB后端加密通讯。 算法简介:
- 加入了时间因子混淆,因此相同的明文,每次加密的结果都不一样,但是只要条件符合,均可以解密出正确的明文。
- 加解密key均转换为数组,且做随机乱序(伪随机,根据密钥与报文长度做乱序),以增加破解难度(基于Ron Rivest提出的RC4算法做的改进),因此保证密钥不泄露是保密的关键工作。
- PHP端在加密时,可以指定超时时间(单位:秒),即超时后,密文无法被解密,以增强安全性。JAVA、Objective-C暂时不支持指定超时参数。
- 三个版本的加解密的KEY需要统一,否则无法进行数据交换。这个问题只要智商正常,应该都能理解。
- 三个版本的加解密算法,对于字符串处理,默认都使用UTF8编码…不解释。
- 三个版本都包含了Demo。PHP的童鞋请关注PHP源码第55-63行所演示的使用方法;JAVA的童鞋请看源码文件最后的main入口;Objective-C的童鞋看main.m 源码。
有条件的可以自己去Github看,没条件的,请下载附件AuthCode_RC4-master.zip 。