分享

利用原生JS+Ascii码表实现一个不可逆的加密算法

 黄三岁大爱人生 2018-07-29

这两天一直没有更新任何的文章,是因为我一直在想这个加密算法应该怎么写,这几天想了很多,终于写了一个自己觉得还比较完备的加密算法,我们没有写之前首先要明白,做一个加密的算法是一件逻辑性要相对强一点,也就是说考虑的要全面一点,这样才可以保证的是加密之后的密码不那么容易的被破解掉。

这个加密的算法名字就叫做CL加密吧,我的名字是ClearLove!

关于加密我之前也写过相关的文章,这里就不做赘述,想看的可以直接去看一下:


所谓的加密,其实就是给原始密码穿件衣服,让黑客第一眼看不出来内核到底是什么!这个我在网上看到一个段子形容的很好:

小的时候,两个人想上课聊天,但是又怕被抓到,这个时候两个人就约定俗成一种规则,1代表您好,2代表吃饭...就这样,纸条上面永远只有阿拉伯数字,那么即使老师拿到了,也是没用的,因为他不知道什么意思,其实这就是加密最初始的思路。还有以前的电报原理也是这样的等等很多现实生活中的例子!

我的思路要求是这样的:

用户输入数字和字母和符号对应出不同的映射表
通过运算法则以后得到一个加密后的密码
不可逆的
但是每次加密的结果都是一样的,这就可以避免使用GUID或者是时间戳进行加密了

以上是简单的要求,那么对应的解决思路是这样的:

第一步:
使用正则表达式将数字、字母、符号分开
第二步:
将数字最后一个数组的数字进行二进制转换,向右移动一位,再转为十进制
第三步:
将字母根据映射表一一对应出
第四步:
将数据每一个部分组合起来

需要避免的情况是:

还要保证的是顺序不同的时候生成的密码是不一样的
那么就要保证的是原始密码顺序不可以变
但是如果完全是原始密码的话,也是不行的,那么就需要将原始密码某一位删除,这样可以保证即使看到了原始密码也一定不是用户输入的密码
要保证的是不同的密码不可能生成同一个加密后的密码
那么就要用到用户原始的部分密码,然后特别的位置进行加密

效果预览:


ps:这里我没有做任何的美化,喜欢或者感兴趣的可以自己美化一下。

我们今天简单的实现这个:

H5源码:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>CL加密</title>
  6. <script src="css/layui/lay/dest/layui.all.js" type="text/javascript" charset="utf-8"></script>
  7. <script src="js/jquery-1.11.2.min.js" type="text/javascript" charset="utf-8"></script>
  8. <script src="js/CL_ency.js" type="text/javascript" charset="utf-8"></script>
  9. <link rel="stylesheet" type="text/css" href="css/layui/css/layui.css"/>
  10. </head>
  11. <style type="text/css">
  12. body{text-align: center;margin-top: 1rem;}
  13. div{background-color: #AAAAAA;height: 20rem;width: 40rem;margin-top: 1rem;margin-left: 30%;}
  14. input{font-family: "agency fb";font-size: 2rem;margin-top: 1rem;}
  15. span{font-family: "agency fb";font-size: 2rem;margin-top: 1rem;}
  16. </style>
  17. <body>
  18. <div id="encry">
  19. <span>输入密码:</span><input type="password" id="psd" value="" />
  20. <input type="button" name="" id="_CLencry" value="CL加密" onclick="ency()"/><br />
  21. <span id="relult"></span>
  22. </div>
  23. </body>
  24. <script type="text/javascript">
  25. /* 加载欢迎的提示 */
  26. /* $(function(){
  27. layer.msg("欢迎使用CL加密");
  28. }) */
  29. function ency(){
  30. var pssd = $("#psd").val();
  31. var j = _CLencrypt(pssd);
  32. $("#relult").empty();
  33. $("#relult").append("加密后的数据是:"+j);
  34. }
  35. </script>
  36. </html>

js源码:

  1. /*
  2. aim : 加密
  3. author : ClearLove
  4. Date : 2018-06-25
  5. Ps : 不经允许,不得擅自使用转载!
  6. */
  7. function _CLencrypt(psd){
  8. var reg = new RegExp(/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/);
  9. if (psd == null || psd.length <8 || psd.length >14) {
  10. alert("密码数在8-14之间");
  11. return false;
  12. }else{
  13. if(!reg.test(psd)){
  14. alert("密码至少包含字母和数字或者符号");
  15. return false;
  16. }
  17. else{
  18. /* 使用正则取出数字 */
  19. var usernum = psd.match(/[1-9][0-9]*/g);
  20. var numlast;//数组的最后一位
  21. var decimalnum;//进行二进制转换,然后向右移动一位,最后转为十进制的结果
  22. var majuscule;//最后一位大写字母
  23. var minuscule;//最后一位小写字母
  24. var alphabet;//剩余的字母除去最后一位的
  25. var allnum;//密码全部的数字
  26. var exceptlast;//去掉字符的最后一位
  27. var allcharts;//原始密码去掉最后一位的值
  28. /* 将数组的最后一组数字拿到 */
  29. numlast = usernum[usernum.length-1];
  30. /* 将拿到的数字进行二进制转换之后在向右移动一位,最后转为十进制得到结果 */
  31. decimalnum = numlast >>> 1;
  32. /* 将里面的字母拿到 */
  33. alphabet = psd.replace(/[0-9]/ig,"");
  34. /* 将字符串的最后一位去掉 */
  35. exceptlast = alphabet.substr(0,alphabet.length - 1);
  36. /* 除最后一位之外的字符串*/
  37. /* 将数据的字符串全部显示为大写 */
  38. var uppsd = psd.toUpperCase();
  39. allcharts = uppsd.substr(0,uppsd.length - 1);
  40. /* 将里面的数字拿到 */
  41. allnum = psd.replace(/[^0-9]/ig,"");
  42. var capital = psd.match(/[a-z][A-Z]*/g);
  43. if(capital == "" || capital == null){
  44. _MBAmapmin(0);
  45. }
  46. else{
  47. /* 对字母进行一一映射 */
  48. /* 将小写字母的最后一位拿到 */
  49. minuscule = capital[capital.length-1];
  50. _MBAmapmin(minuscule);
  51. }
  52. /* 将大写字母的最后一位拿到 */
  53. var lowercase = psd.match(/[A-Z][a-z]*/g);
  54. if(lowercase == "" || lowercase == null){
  55. _MBAmapmaj(0);
  56. }
  57. else{
  58. /* 对字母进行一一映射 */
  59. majuscule = lowercase[lowercase.length-1];
  60. _MBAmapmaj(majuscule);
  61. }
  62. /* 将最后的每一部分拼接出来 */
  63. var algorithm = Ascii_minuscule + decimalnum + allcharts + Ascii_majuscule;
  64. return algorithm;
  65. }
  66. }
  67. }
  68. /* 字母映射表 对应的是小写字母的Ascii码表中的二进制*/
  69. var Ascii_minuscule;//小写字母对应的Ascii二进制数据
  70. var Ascii_majuscule;//大写字母对应的Ascii二进制数据
  71. function _MBAmapmin(minuscule){
  72. switch(minuscule){
  73. case 'a':
  74. Ascii_minuscule = "01100001";
  75. break;
  76. case 'b':
  77. Ascii_minuscule = "01100010";
  78. break;
  79. case 'c':
  80. Ascii_minuscule = "01100011";
  81. break;
  82. case 'd':
  83. Ascii_minuscule = "01100100";
  84. break;
  85. case 'e':
  86. Ascii_minuscule = "01100101";
  87. break;
  88. case 'f':
  89. Ascii_minuscule = "01100110";
  90. break;
  91. case 'g':
  92. Ascii_minuscule = "01100111";
  93. break;
  94. case 'h':
  95. Ascii_minuscule = "01101000";
  96. break;
  97. case 'i':
  98. Ascii_minuscule = "01101001";
  99. break;
  100. case 'j':
  101. Ascii_minuscule = "01101010";
  102. break;
  103. case 'k':
  104. Ascii_minuscule = "01101011";
  105. break;
  106. case 'l':
  107. Ascii_minuscule = "01101100";
  108. break;
  109. case 'm':
  110. Ascii_minuscule = "01101101";
  111. break;
  112. case 'n':
  113. Ascii_minuscule = "01101110";
  114. break;
  115. case 'o':
  116. Ascii_minuscule = "01101111";
  117. break;
  118. case 'p':
  119. Ascii_minuscule = "01110000";
  120. break;
  121. case 'q':
  122. Ascii_minuscule = "01110001";
  123. break;
  124. case 'r':
  125. Ascii_minuscule = "01110010";
  126. break;
  127. case 's':
  128. Ascii_minuscule = "01110011";
  129. break;
  130. case 't':
  131. Ascii_minuscule = "01110100";
  132. break;
  133. case 'u':
  134. Ascii_minuscule = "01110101";
  135. break;
  136. case 'v':
  137. Ascii_minuscule = "01110110";
  138. break;
  139. case 'w':
  140. Ascii_minuscule = "01110111";
  141. break;
  142. case 'x':
  143. Ascii_minuscule = "01111000";
  144. break;
  145. case 'y':
  146. Ascii_minuscule = "01111001";
  147. break;
  148. case 'z':
  149. Ascii_minuscule = "01111010";
  150. break;
  151. default:
  152. Ascii_minuscule = "00000000"
  153. }
  154. }
  155. /* 字母映射表 对应的是大写字母的Ascii码表中的二进制*/
  156. function _MBAmapmaj(majuscule){
  157. switch(majuscule){
  158. case 'A':
  159. Ascii_majuscule = "01000001";
  160. break;
  161. case 'B':
  162. Ascii_majuscule = "01000010";
  163. break;
  164. case 'C':
  165. Ascii_majuscule = "01000011";
  166. break;
  167. case 'D':
  168. Ascii_majuscule = "01000100";
  169. break;
  170. case 'E':
  171. Ascii_majuscule = "01000101";
  172. break;
  173. case 'F':
  174. Ascii_majuscule = "01000110";
  175. break;
  176. case 'G':
  177. Ascii_majuscule = "01000111";
  178. break;
  179. case 'H':
  180. Ascii_majuscule = "01001000";
  181. break;
  182. case 'I':
  183. Ascii_majuscule = "01001001";
  184. break;
  185. case 'J':
  186. Ascii_majuscule = "01001010";
  187. break;
  188. case 'K':
  189. Ascii_majuscule = "01001011";
  190. break;
  191. case 'L':
  192. Ascii_majuscule = "01001100";
  193. break;
  194. case 'M':
  195. Ascii_majuscule = "01001101";
  196. break;
  197. case 'N':
  198. Ascii_majuscule = "01001110";
  199. break;
  200. case 'O':
  201. Ascii_majuscule = "01001111";
  202. break;
  203. case 'P':
  204. Ascii_majuscule = "01010000";
  205. break;
  206. case 'Q':
  207. Ascii_majuscule = "01010001";
  208. break;
  209. case 'R':
  210. Ascii_majuscule = "01010010";
  211. break;
  212. case 'S':
  213. Ascii_majuscule = "01010011";
  214. break;
  215. case 'T':
  216. Ascii_majuscule = "01010100";
  217. break;
  218. case 'U':
  219. Ascii_majuscule = "01010101";
  220. break;
  221. case 'V':
  222. Ascii_majuscule = "01010110";
  223. break;
  224. case 'W':
  225. Ascii_majuscule = "01010111";
  226. break;
  227. case 'X':
  228. Ascii_majuscule = "01011000";
  229. break;
  230. case 'Y':
  231. Ascii_majuscule = "01011001";
  232. break;
  233. case 'Z':
  234. Ascii_majuscule = "01011010";
  235. break;
  236. default:
  237. Ascii_majuscule = "00000000"
  238. }
  239. }

ps1:这里的字母对照表使用的是Ascii码表,使用这个的原因有以下几个:

第一:他是没有重复的

第二:他是二进制数据

ps2:这里看完js的人应该可以看出问题,就是我没有删除密码里面的最后一位数字,原因是这样的,我对数字的处理是先将数字拿到,然后将拿到的数字的最后一位进行二进制运算,之后将运算的结果向右移动一位,最后将移动后的数据转为十进制得到的,那么这个时候我们是可以破解的,但是如果用户的密码刚好是String类型的加上数字的,那么这个时候我拼接的字符串那里是十进制数据加上原始数字密码,这个时候是可以知道用户的密码是从第几位开始的,因为你可以看到最后一位,然后你将最后一位的数据按照我的预算规则预算出一个结果,然后去掉拼接的字符串就是原始的密码开始的位置,这样做的目的是给以后写解密留后路!

ps3:为什么说这个是不可逆的呢?因为我将所有的密码全部转为大写的,这样即使拿到了密码,也是不知道原始的第几位是小写,但是这样写有一定的风险,就是如果两个密码完全一样, 只有大小写不一样的时候,那么生成的密码可能是一样的。

最后,这个算法虽然我想了一下,但是漏洞还是很多的,只是说小的公司要求不高的,但是有需要加密的,是可以借鉴的,毕竟小生能力有限,不过不是说做不出来完备的,只是没有那么多的精力,其实如果有兴趣的话,完全可以将密码的每一位都取出来,然后每一位都进行自己定义的规则码进行加密,这样被破解的可能性就相对小一点,甚至说只要规则不被破解,永远不会被破解!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约