使用JScript.encode进行网页的加密与解密

我们常常看到类似新浪上面的视频播放页面源文件是一堆乱码,实际上是经过JScript加密过的代码,这样可以防止普通用户轻易的找到视频源文件地址,从而盗链,下面把JScript加密解密的方法整理了一下:


申明:下面代码非本人原创,而是经过收集和整理的结果,由于原作者不祥,在此特说明。

JScript.encode实现加密解密的脚本代码如下:

<script language="JavaScript">
<!--
function screncode(s,l)
{enc=new ActiveXObject("Scripting.Encoder");
return enc.EncodeScriptFile("."+l,s,0,l+"cript");
}
 
var STATE_COPY_INPUT = 100
var STATE_READLEN = 101
var STATE_DECODE = 102
var STATE_UNESCAPE = 103
 
var pick_encoding = new Array(
1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
)
 
var rawData = new Array(
0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F
)
 
var transformed = new Array()
for (var i=0; i<3; i++) transformed[i] = new Array()
for (var i=31; i<=126; i++) for (var j=0; j<3; j++) transformed[j][rawData[(i-31) * 3 + j]] = (i==31) ? 9 : i
 
var digits = new Array()
for (var i=0; i<26; i++)
{
digits["A".charCodeAt(0)+i] = i
digits["a".charCodeAt(0)+i] = i+26
}
for (var i=0; i<10; i++) digits["0".charCodeAt(0)+i] = i+52
digits[0x2b] = 62
digits[0x2f] = 63
 
function unescape(char)
{
var escapes = "#&!*$"
var escaped = "\r\n<>@"
 
if (char.charCodeAt(0) > 126) return char
if (escapes.indexOf(char) != -1) return escaped.substr(escapes.indexOf(char), 1)
return "?"
}
 
function decodeBase64(string)
{
var val = 0
val += (digits[string.substr(0,1).charCodeAt(0)] << 2)
val += (digits[string.substr(1,1).charCodeAt(0)] >> 4)
val += (digits[string.substr(1,1).charCodeAt(0)] & 0xf) << 12
val += ((digits[string.substr(2,1).charCodeAt(0)] >> 2) << 8)
val += ((digits[string.substr(2,1).charCodeAt(0)] & 0x3) << 22)
val += (digits[string.substr(3,1).charCodeAt(0)] << 16)
return val
}
 
function strdec(encodingString)
{
 
var marker = "#@~^"
var stringIndex = 0
var scriptIndex = -1
var unEncodingIndex = 0
var char = null
var encodingLength = unEncodinglength = 0
var state = STATE_COPY_INPUT
var unEncodingString = ""
var re, arr
 
while(state)
{
switch (state)
{
case (STATE_COPY_INPUT) :
scriptIndex = encodingString.indexOf(marker, stringIndex)
if (scriptIndex != -1)
{
unEncodingString += encodingString.substring(stringIndex, scriptIndex)
scriptIndex += marker.length
state = STATE_READLEN
}
else
{
stringIndex = stringIndex==0 ? 0 : stringIndex
unEncodingString += encodingString.substr(stringIndex, encodingString.length)
state = 0
}
break
 
case (STATE_READLEN) :
encodingLength = encodingString.substr(scriptIndex, 6)
unEncodinglength = decodeBase64(encodingLength)
scriptIndex += (6 + "==".length)
state = STATE_DECODE
break
 
case (STATE_DECODE) :
if (!unEncodinglength)
{
stringIndex = scriptIndex + "DQgAAA==^#~@".length
unEncodingIndex = 0
state = STATE_COPY_INPUT
break
}
char = encodingString.substr(scriptIndex, 1)
if (char == "@") state = STATE_UNESCAPE
else
{
if (char.charCodeAt(0) < 0xFF)
{
unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])
unEncodingIndex++
}
else
{
unEncodingString += char
}
scriptIndex++
unEncodinglength--
break
}
 
case STATE_UNESCAPE:
unEncodingString += unescape(encodingString.substr(++scriptIndex, 1))
scriptIndex++; unEncodinglength -=2
unEncodingIndex++
state = STATE_DECODE
break
}
}
 
re = new RegExp("(JScript|VBscript).encode", "gmi")
while(arr = re.exec(unEncodingString)) unEncodingString = RegExp.leftContext + RegExp.$1 + RegExp.rightContext
return unEncodingString
}
 
//-->
<
/script>

上面代码的使用方法如下:
1、建一个.htm的文件,加入上面的代码。
2、再后面写上:

<form name="form">
<TEXTAREA NAME="code" ROWS="20" COLS="40" onfocus=this.select()>在这里写入你要加密或解密的内容。</TEXTAREA><BR>
<INPUT TYPE="button" value="/JScript.encode加密" onclick="this.form.code.value="/screncode(this.form.code.value,"'JS')">
<INPUT TYPE="button" value="/JScript.encode解密" onclick="this.form.code.value="/strdec(this.form.code.value)"">
</form>

3、保存该文件,用浏览器打开就可以进行加密和解密了。

下面有一个我做好的在线可以直接使用的页面,大家可以直接访问进行加密解密:
http://www.toplee.com/blog/wp-content/pages/jsencode.html

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
8 Responses
  1. Pingback: Anonymous
  2. ngs says:

    不能加密

  3. hxp says:

    这段代码不能解全,请问有什么更好的办法呢?

  4. hxp says:

    #@~^SQUAAA==@#@&P~,P,Pq6PgGYvkd1!:n.bm`Mn;!+/DcEmm//GDOmbNE#*bP:tnU@#@&P~~,P~IdaWUk+cDbY~J@!w@*@!aPCsbox{^+Y+M@*´íÎó²Ù×÷£¡@!za@*r@#@&P~~,P~IdwKxdnc2x[@#@&P~P,~,2U9P&0@#@&P,2lT+xD;;nkYR$;+MX/D.rxT`rwConE*@#@&P,r0,wCL’JE~Dtnx,2mon{F@#@&P,k6~xKYckkx;hDk1cwmo+*b~Y4+ P2lLn{F@#@&,~k6P2CT+@!q~Dtnx,2mon{F@#@&P,wmL+{kUYvwCL#@#@&~Pk+Y,.d’k+M\nD ^M+CYG4N+^OvJl[G94 D^KD[k+DJ#@#@&,~k6P.+$EndD`J1C//WMOmk9J*’EJ~O4+U@#@&~Pk;sxr/+sn1Y~e,WMWh,\x/4Wammm/nPKD[nMP4H~mm/+|r[PG2UZE@#@&~,+s/@#@&,P-n /tG2|mC/dKDO{k Y`M+$;+kYcJ1ldnkWDDmk9J#*@#@&P,/$VxJdn^+^Y,MP6DGh,\+Ud4W2{1Ck+~StD+,\U/4W2{1ldnkWDDxJL\+ d4Wa{1ld+dGMY’J,GD9+.~(XP^Ck+mk9~G2j;J@#@&P,+ [Pb0@#@&,P.dcWwUPk;VB^Gx ~2~f@#@&~,kWPMdRWW~Dt+U@#@&P~P,~,DnkwKx/RS.kD+~JÔÝÇÒûÓа¸Àýr@#@&~,PP,~D/wKUd+c+ N@#@&~~Vd+@#@&P,P~~,D/ 2mon/b”’+Z@#@&PP,P,~YKYCVM+^xM/RMnmKDN1G;xD@#@&P~P~~,YGYmswmonxM/R2CT+^W!UD@#@&,P,PP,k6~wmon@*DWOC^wlTnPDt+ ~2lT+{YGYCsalL+@#@&P,P~~,D/ C(/GV!OwCT+{wlT+@#@&P,P~P,kxT@#@&P,~P,PNK~AtbVPUWO~M/ +KWPmx[~vk@!.dcwCodbyn*@#@&PP,P,~k{kQF@#@&~~,PP,.+9k:,2.+k+M\nP^Ck+mk9ck*~-n /tG2|mC/Um:nvk*~\xk4Wa{^lk+[CD+`bb~7+xk4Gw|mm/nmGUD+UYvr#@#@&~~,PP~-xdtK2|mCk+ l:`bb’M/cJ7+Ud4Ww|^lk+xmhnJ*@#@&P~P~~,mC/mk9`rb{D/cE1ld+|r9Jb@#@&,PP,P,-+ /4Wa{^Ck+NmO+vk#{.d`r\xdtG2|mC/[lD+Eb@#@&P~~,P~\UktGa{1l/mKUYxO`b#x.k`J7nxktWam^lk+1WUYnUDJb@#@&~P,P~~M/RhG7+U+XO@#@&~,P,PP^WK2@#@&P~+ N~r6@#@&,~DkRm^Gd+@#@&,PEYsBAA==^#~@

    这段代码怎么解不全呢?

  5. huangfeifeu says:

    为什么只能解密,不能加密呢?这段程序代码有问题吗?

  6. Michael says:

    好像跟你浏览器或者系统上是否有一个控件有关系,具体的我也得研究研究:(

  7. kinghtonline says:

    我也是这觉得有点问题,有谁知道帮帮我,谢谢!

  8. 太复杂了,呵呵!

Leave a Reply

Your email address will not be published. Required fields are marked *

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Anti-spam image