C# 实现的Javascript加密算法
时间:2022-06-19
本文章向大家介绍C# 实现的Javascript加密算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
不打算公开的,不过转念一想,反正又没人看,就发出来吧。 这是使用C#来实现的JS加密的,被加密的JS文件,代码需要写的规范,不能少了分号(;)等js中可能会被忽略的符号。 下面是完整代码,自己看吧
public class JavascriptEncoder
{
public static string ENCODE_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$";
public bool isDebug = false;
public string JsEncode(string filename, int offset)
{
string js = WebTools.FileObj.ReadFile(HttpContext.Current.Request.MapPath(string.Format("/tmp/{0}", filename)));
int length = js.Length;
js = RemoveAnnotation(js);
WebTools.FileObj.WriteFile(System.Web.HttpContext.Current.Request.MapPath("tmp.js"), js);
StringBuilder sb = new StringBuilder(js);
sb.Replace(@"r", " "); //n替换为空格
sb.Replace(@"n", " "); //n替换为空格
sb.Replace(Environment.NewLine, " ");
sb.Replace((char)13, (char)32);
sb.Replace((char)10, (char)32);
sb.Replace(@"", @"\"); //替换为\
sb.Replace(@"'", @"'"); // '替换为'
js = sb.ToString();
Regex regex = new Regex(@"([w$]+)");
MatchCollection matches = regex.Matches(js);
string element = "";
List<string> dict = new List<string>();
int index = 0;
StringBuilder encscript = new StringBuilder(js);
StringBuilder dicttab = new StringBuilder();
foreach (Match match in matches)
{
element = match.Groups[1].Value;
index = dict.FindIndex(m => m.Equals(element));
if ( index < 0)
{
dict.Add(element);
index = dict.Count - 1;
}
encscript.Replace(element, Base64Encode(offset + index + 1));
//regex.Replace(js,element, Base64Encode(offset + index + 1));
}
foreach(string d in dict)
{
dicttab.AppendFormat("{0}|", d);
}
string dictstr = dicttab.ToString().TrimEnd('|'); //字典字符串,删除最后一个|
string res = formatCode(encscript.ToString(), dictstr, dict.Count, offset);
return res;
}
/// <summary>
/// 仿Base64
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
private string Base64Encode(int c)
{
string res="";
if (c < 0) throw new Exception("Error:Offset必须>=0.");
if (c > 63)
res = Base64Encode(c >> 6) + Base64Encode(c & 63);
else {
//为了配合appendReplacement方法的使用,将$替换为$
res = c.Equals(63) ? @"$" : ENCODE_BASE64[c].ToString();
}
return res;
}
private string formatCode(string enc, string dict, int size, int offset)
{
StringBuilder sb = new StringBuilder();
sb.Append("/* Power by Shoresoft.Cn */neval(function(E,I,A,D,J,K,L,H){function C(A){return A<62?String.fromCharCode(A+=A<26?65:A<52?71:-4):A<63?'_':A<64?'$':C(A>>6)+C(A&63)}while(A>0)K[C(D--)]=I[--A];function N(A){return K[A]==L[A]?A:K[A]}if(''.replace(/^/,String)){var M=E.match(J),B=M[0],F=E.split(J),G=0;if(E.indexOf(F[0]))F=[''].concat(F);do{H[A++]=F[G++];H[A++]=N(B)}while(B=M[G]);H[A++]=F[G]||'';return H.join('')}return E.replace(J,N)}(");
sb.Append("'" + enc + "',");
sb.Append("'" + dict + "'.split('|'),");
sb.Append(size + "," + (size + offset) + ",/[\w\$]+/g, {}, {}, []))");
return sb.ToString();
}
/// <summary>
/// 移除块注释
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private string RemoveAnnotation(string str)
{
string result = str;
int start = 0;
int end = 0;
start = str.IndexOf("/*");
end = str.IndexOf("*/");
StringBuilder sb = new StringBuilder(str);
if (start >= 0 && end>start)
{
sb.Remove(start, end - start + 2);
return RemoveAnnotation(sb.ToString());
}
else
return sb.ToString();
}
}
本文作者:老徐 本文链接:https://bigger.ee/archives/26.html 转载时须注明出处及本声明
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 卷积神经网络之 - Alexnet
- Linux系列之学会使用Top命令进行系统监控
- 一简单线程同步笔试题分享,欢迎纠错分享更多思路
- 卷积神经网络之-NiN 网络(Network In Network)
- 【注意力机制】空间注意力机制之Spatial Transformer Network
- 【小技巧】用Python给你的视频添加字幕
- 震惊!我三步就搞定了 Tomcat 源码环境搭建!
- 【小技巧】深度学习中的那些效率提升利器(附资源)
- 多个线程为了同个资源打起架来了,操作系统是如何让他们安分的?
- 学习链表,这些题你值得一刷!
- Gophish钓鱼测试
- 【位运算】只出现一次的数字 II,数电的知识终于用上了!
- Swaks伪造邮件发件人绕过SPF
- 某次网站的渗透测试
- phpMyAdmin 渗透利用总结