一:最简单的加密解密
大家对于JAVASCRIPT函数escape()和unescape()想必是比较了解啦(很多网页加密在用它们),分别是编码和解码字符串,比如例子代码用escape()函数加密后变为如下格式:
alert%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B
如何?还看的懂吗?当然其中的ASCII字符"alert"并没有被加密,如果愿意我们可以写点JAVASCRIPT代码重新把它加密如下:
%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B
呵呵!如何?这次是完全都加密了!
当然,这样加密后的代码是不能直接运行的,幸好还有eval(codeString)可用,这个函数的作用就是检查JavaScript代码并执行,必选项 codeString 参数是包含有效 JavaScript 代码的字符串值,加上上面的解码unescape(),加密后的结果如下:
SCRIPT LANGUAGE="JavaScript"
var code=unescape("%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B");
eval(code)
/SCRIPT
是不是很简单?不要高兴,解密也就同样的简单,解密代码都摆给别人啦(unescape())!呵呵
二:转义字符"\"的妙用
大家可能对转义字符"\"不太熟悉,但对于JavaScript提供了一些特殊字符如:\n (换行)、 \r (回车)、\' (单引号 )等应该是有所了解的吧?其实"\"后面还可以跟八进制或十六进制的数字,如字符"a"则可以表示为:"\141"或"\x61"(注意是小写字符"x"),至于双字节字符如汉字"黑"则仅能用十六进制表示为"\u9ED1"(注意是小写字符"u"),其中字符"u"表示是双字节字符,根据这个原理例子代码则可以表示为:
八进制转义字符串如下:
SCRIPT LANGUAGE="JavaScript"
eval("\141\154\145\162\164\50\42\u9ED1\u5BA2\u9632\u7EBF\42\51\73")
/SCRIPT
十六进制转义字符串如下:
SCRIPT LANGUAGE="JavaScript"
eval("\x61\x6C\x65\x72\x74\x28\x22\u9ED1\u5BA2\u9632\u7EBF\x22\x29\x3B")
/SCRIPT
这次没有了解码函数,因为JavaScript执行时会自行转换,同样解码也是很简单如下:
SCRIPT LANGUAGE="JavaScript"
alert("\x61\x6C\x65\x72\x74\x28\x22\u9ED1\u5BA2\u9632\u7EBF\x22\x29\x3B")
/SCRIPT
就会弹出对话框告诉你解密后的结果!
首先你的加密后的代码有误,无法执行,应将return(c35?String.fromCharCode(c+29):
修改为return(ca?"":e(parseInt(c/a)))+((c=c%a)35?String.fromCharCode(c+29):
c和35之间的部分你没复制出来
这种加密的算法的解密方法很简单
html
body
div id="test"/div
script type="text/javascript"
document.getElementById('test').innerHTML = 将需要破解的代码全部复制过来,注意你原来的代码不对,请通过替换先将上面说的那个错误改正
/script
/body
/html
将上面的代码保存成html文件,打开此文件即可看到加密前的内容,由于你的问题解密后是广告语,所以不在此处给出,自己试一下
在网页中加入一个,然后在加密代码中找document.write(),eval(),execScript()或VBS的EXECUTE语句,并用document.getElementById("textareaID").innerText=STR 替换。加密就不攻自破了。
(STR是转换好的字符串变量,如在加密代码中找到 document.write(s); 就用 document.getElementById("textareaID").innerText=s; 替换)
这不是加密,只是把行给去掉了
现在还原
(function(c) {
function s(b) {
if (b = RegExp("(^| )" + b + "=([^;]*)(;|$)").exec(document.cookie)) return unescape(b[2] || "");
return ""
}
function t(b) {
b = b || document.domain;
b.indexOf("www.") === 0 (b = b.substr(4));
var a = b.match(/([a-z0-9][a-z0-9\-]*?\.(?:com|cn|net|org|gov|info|la|cc|co|jp)(?:\.(?:cn|jp))?)$/);
if (a) return a[0];
return b
}
function C() {
var b, a;
a = navigator;
if (a.plugins a.mimeTypes.length) {
if ((b = a.plugins["Shockwave Flash"]) b.description) return b.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s)+r/,
因为解码失败了。
加解集-加密与解密工具合集下载不了,这个是由于解码失败导致的,可以进行解码器的升级,还可以进行在线解码,通过线上解码来提高解码的成功率,还可以通过解码获得这个解码的的效率
最近一个vue项目要求所有密码数据需要使用RSA非对称加密传输,以为挺简单,结果开发过程中还是遇到了些问题,简单做个笔记。同时也希望可以帮助到遇到同样问题的道友门。
重点来了:使用jsencrypt实现RSA非对称加解密
因为这里直接在前端加解密,所以需要一对现成的密钥,我们通过 密钥在线生成器 得到:
然后在需要使用的文件中引入JSEncrypt,我是将所有工具函数都封装在一个js文件的,我就直接在该文件中引入,我看也有人是在main.js中引入的。
到这里我们的加密解密方法就完成了,在需要的地方直接拿过来用就好了!
大功告成!这样就完了?我以为这样就ok了。
当然,如果没有遇到这个bug,就可以忽略下面的内容了。
从上面截图可以看到,重启项目的时候报错: navigator is not defined
而且这个bug有点奇葩,先启动项目再引入jsencrypt就什么问题都没有,但是先引入jsencrypt再启动项目就报错。这也是我前面能顺利执行的原因所在。
通过好一通折腾,用了网上的各种方法,比如在main.js引入jsencrypt、引入jsdom之类的,都没能解决这个问题,最终还是在jsencrypt的git相关 issue 下找到了这个问题的解决方案。
到这里问题就算基本解决了,但是由于项目组不止我一个前端,我不能要求每个同事或者以后接手维护项目的同事都要在node_modules中去替换文件。
所以就采用了另外一种方案:将jsencrypt.js通过在线js压缩器压缩至jsencrypt.min.js中,然后把jsencrypt.min.js放到src/assets/jsencrypt文件夹中,就不用npm install的方式了。
换了种方式,jsencrypt的引用方式需要做出相应的调整:
参考链接: RSA非对称加密传输---前端加密解密(VUE项目)
PS:才疏学浅,如果有考虑不周之处或者有更好的解决方案,欢迎指正探讨!