这两天一直没有更新任何的文章,是因为我一直在想这个加密算法应该怎么写,这几天想了很多,终于写了一个自己觉得还比较完备的加密算法,我们没有写之前首先要明白,做一个加密的算法是一件逻辑性要相对强一点,也就是说考虑的要全面一点,这样才可以保证的是加密之后的密码不那么容易的被破解掉。 这个加密的算法名字就叫做CL加密吧,我的名字是ClearLove! 关于加密我之前也写过相关的文章,这里就不做赘述,想看的可以直接去看一下:
所谓的加密,其实就是给原始密码穿件衣服,让黑客第一眼看不出来内核到底是什么!这个我在网上看到一个段子形容的很好: 小的时候,两个人想上课聊天,但是又怕被抓到,这个时候两个人就约定俗成一种规则,1代表您好,2代表吃饭...就这样,纸条上面永远只有阿拉伯数字,那么即使老师拿到了,也是没用的,因为他不知道什么意思,其实这就是加密最初始的思路。还有以前的电报原理也是这样的等等很多现实生活中的例子! 我的思路要求是这样的: 用户输入数字和字母和符号对应出不同的映射表
通过运算法则以后得到一个加密后的密码
不可逆的
但是每次加密的结果都是一样的,这就可以避免使用GUID或者是时间戳进行加密了
以上是简单的要求,那么对应的解决思路是这样的: 第一步:
使用正则表达式将数字、字母、符号分开
第二步:
将数字最后一个数组的数字进行二进制转换,向右移动一位,再转为十进制
第三步:
将字母根据映射表一一对应出
第四步:
将数据每一个部分组合起来
需要避免的情况是: 还要保证的是顺序不同的时候生成的密码是不一样的
那么就要保证的是原始密码顺序不可以变
但是如果完全是原始密码的话,也是不行的,那么就需要将原始密码某一位删除,这样可以保证即使看到了原始密码也一定不是用户输入的密码
要保证的是不同的密码不可能生成同一个加密后的密码
那么就要用到用户原始的部分密码,然后特别的位置进行加密
效果预览:
ps:这里我没有做任何的美化,喜欢或者感兴趣的可以自己美化一下。 我们今天简单的实现这个: H5源码: <script src="css/layui/lay/dest/layui.all.js" type="text/javascript" charset="utf-8"></script> <script src="js/jquery-1.11.2.min.js" type="text/javascript" charset="utf-8"></script> <script src="js/CL_ency.js" type="text/javascript" charset="utf-8"></script> <link rel="stylesheet" type="text/css" href="css/layui/css/layui.css"/> body{text-align: center;margin-top: 1rem;} div{background-color: #AAAAAA;height: 20rem;width: 40rem;margin-top: 1rem;margin-left: 30%;} input{font-family: "agency fb";font-size: 2rem;margin-top: 1rem;} span{font-family: "agency fb";font-size: 2rem;margin-top: 1rem;} <span>输入密码:</span><input type="password" id="psd" value="" /> <input type="button" name="" id="_CLencry" value="CL加密" onclick="ency()"/><br /> <span id="relult"></span> <script type="text/javascript"> var pssd = $("#psd").val(); var j = _CLencrypt(pssd); $("#relult").append("加密后的数据是:"+j);
js源码: function _CLencrypt(psd){ var reg = new RegExp(/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/); if (psd == null || psd.length <8 || psd.length >14) { alert("密码至少包含字母和数字或者符号"); var usernum = psd.match(/[1-9][0-9]*/g); var decimalnum;//进行二进制转换,然后向右移动一位,最后转为十进制的结果 var alphabet;//剩余的字母除去最后一位的 var exceptlast;//去掉字符的最后一位 var allcharts;//原始密码去掉最后一位的值 numlast = usernum[usernum.length-1]; /* 将拿到的数字进行二进制转换之后在向右移动一位,最后转为十进制得到结果 */ decimalnum = numlast >>> 1; alphabet = psd.replace(/[0-9]/ig,""); exceptlast = alphabet.substr(0,alphabet.length - 1); var uppsd = psd.toUpperCase(); allcharts = uppsd.substr(0,uppsd.length - 1); allnum = psd.replace(/[^0-9]/ig,""); var capital = psd.match(/[a-z][A-Z]*/g); if(capital == "" || capital == null){ minuscule = capital[capital.length-1]; var lowercase = psd.match(/[A-Z][a-z]*/g); if(lowercase == "" || lowercase == null){ majuscule = lowercase[lowercase.length-1]; var algorithm = Ascii_minuscule + decimalnum + allcharts + Ascii_majuscule; /* 字母映射表 对应的是小写字母的Ascii码表中的二进制*/ var Ascii_minuscule;//小写字母对应的Ascii二进制数据 var Ascii_majuscule;//大写字母对应的Ascii二进制数据 function _MBAmapmin(minuscule){ Ascii_minuscule = "01100001"; Ascii_minuscule = "01100010"; Ascii_minuscule = "01100011"; Ascii_minuscule = "01100100"; Ascii_minuscule = "01100101"; Ascii_minuscule = "01100110"; Ascii_minuscule = "01100111"; Ascii_minuscule = "01101000"; Ascii_minuscule = "01101001"; Ascii_minuscule = "01101010"; Ascii_minuscule = "01101011"; Ascii_minuscule = "01101100"; Ascii_minuscule = "01101101"; Ascii_minuscule = "01101110"; Ascii_minuscule = "01101111"; Ascii_minuscule = "01110000"; Ascii_minuscule = "01110001"; Ascii_minuscule = "01110010"; Ascii_minuscule = "01110011"; Ascii_minuscule = "01110100"; Ascii_minuscule = "01110101"; Ascii_minuscule = "01110110"; Ascii_minuscule = "01110111"; Ascii_minuscule = "01111000"; Ascii_minuscule = "01111001"; Ascii_minuscule = "01111010"; Ascii_minuscule = "00000000" /* 字母映射表 对应的是大写字母的Ascii码表中的二进制*/ function _MBAmapmaj(majuscule){ Ascii_majuscule = "01000001"; Ascii_majuscule = "01000010"; Ascii_majuscule = "01000011"; Ascii_majuscule = "01000100"; Ascii_majuscule = "01000101"; Ascii_majuscule = "01000110"; Ascii_majuscule = "01000111"; Ascii_majuscule = "01001000"; Ascii_majuscule = "01001001"; Ascii_majuscule = "01001010"; Ascii_majuscule = "01001011"; Ascii_majuscule = "01001100"; Ascii_majuscule = "01001101"; Ascii_majuscule = "01001110"; Ascii_majuscule = "01001111"; Ascii_majuscule = "01010000"; Ascii_majuscule = "01010001"; Ascii_majuscule = "01010010"; Ascii_majuscule = "01010011"; Ascii_majuscule = "01010100"; Ascii_majuscule = "01010101"; Ascii_majuscule = "01010110"; Ascii_majuscule = "01010111"; Ascii_majuscule = "01011000"; Ascii_majuscule = "01011001"; Ascii_majuscule = "01011010"; Ascii_majuscule = "00000000"
ps1:这里的字母对照表使用的是Ascii码表,使用这个的原因有以下几个: 第一:他是没有重复的 第二:他是二进制数据 ps2:这里看完js的人应该可以看出问题,就是我没有删除密码里面的最后一位数字,原因是这样的,我对数字的处理是先将数字拿到,然后将拿到的数字的最后一位进行二进制运算,之后将运算的结果向右移动一位,最后将移动后的数据转为十进制得到的,那么这个时候我们是可以破解的,但是如果用户的密码刚好是String类型的加上数字的,那么这个时候我拼接的字符串那里是十进制数据加上原始数字密码,这个时候是可以知道用户的密码是从第几位开始的,因为你可以看到最后一位,然后你将最后一位的数据按照我的预算规则预算出一个结果,然后去掉拼接的字符串就是原始的密码开始的位置,这样做的目的是给以后写解密留后路! ps3:为什么说这个是不可逆的呢?因为我将所有的密码全部转为大写的,这样即使拿到了密码,也是不知道原始的第几位是小写,但是这样写有一定的风险,就是如果两个密码完全一样, 只有大小写不一样的时候,那么生成的密码可能是一样的。 最后,这个算法虽然我想了一下,但是漏洞还是很多的,只是说小的公司要求不高的,但是有需要加密的,是可以借鉴的,毕竟小生能力有限,不过不是说做不出来完备的,只是没有那么多的精力,其实如果有兴趣的话,完全可以将密码的每一位都取出来,然后每一位都进行自己定义的规则码进行加密,这样被破解的可能性就相对小一点,甚至说只要规则不被破解,永远不会被破解!
|