用HTML和JavaScript写的RSA加密小工具

来源:互联网 发布:游戏编程入门 道森 pdf 编辑:程序博客网 时间:2024/05/22 12:14

运用网页设计的方式写了一个RSA小工具

有浏览器能看网页的机器上都能用

源码地址:http://download.csdn.net/download/qq389146213/9596275


生成RSA密钥:

cryptico.browser.js 是网上找到的现成代码 我只做了一点点修改

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" /><script language="JavaScript" type="text/javascript" src="cryptico.browser.js"></script><title>生成RSA密钥</title></head><body><script type="text/javascript">function showKey(){var psw=document.getElementById("keyForPrivate").value;if(psw==document.getElementById("keyForPrivate2").value){var Bits = 2048;var rsaKey = cryptico.generateRSAKey(psw, Bits);var publicKeyString = cryptico.publicKeyString(rsaKey);var aesKey = cryptico.string2bytes(cryptico.b64to256("L7UotmZPW5e1DFI3xEN1Y2jfLatPhtNNRNL2Zb/TyUE="));aesKey = cryptico.string2bytes(cryptico.b64to256(cryptico.encryptAESECB(escape(psw), aesKey)));aesKey = aesKey.slice(0, 16);var privateKeyString = cryptico.privateKeyString(rsaKey,aesKey);document.getElementById("publicKey").value=publicKeyString;document.getElementById("privateKey").value=privateKeyString;var myDiv=document.getElementById("err");myDiv.innerText="请记住这个密码以后会用得到";}else{var myDiv=document.getElementById("err");myDiv.innerText="两次输入的密码不一致请重试!";}}</script> <p>请设置你的密码:<input type="password" name="keyForPrivate" id="keyForPrivate"></><p>再输入一遍密码:<input type="password" name="keyForPrivate2" id="keyForPrivate2"></><p id="err"></p><p><button onclick="showKey()">先在上方输入密码然后点我生成密钥<br/>(可能需要1分钟左右的时间)</button></><p>生成密钥之后请复制下框中的内容<br/>然后粘贴到空文本文件中并保存为:我的公钥.txt</p><textarea name="publicKey" rows="5" cols="30" id="publicKey"></textarea><p>生成密钥之后请复制下框中的内容<br/>然后粘贴到空文本文件中并保存为:我的私钥.txt</p><textarea name="privateKey" rows="5" cols="30" id="privateKey"></textarea><p>公钥和私钥一次产生一对 就像鞋子是成双的<br/>左脚穿拖鞋右脚穿布鞋可不行哦!</p><p>懂编程或者会网页设计的人可以用记事本打开各个文件<br/>查看本程序的具体运行方式和内在逻辑<br/>对于不懂代码的人这里简单介绍一下加密和解密<br/>加密实际上就是将一些能明确表达某种意思的信息打乱<br/>变成一堆乱七八糟的东西。解密自然就是加密的反向运作<br/>把那堆打乱的东西重新还原,解密的过程中就需要用到密码<br/>只有那些拥有正确密码的人才能正确解密<br/>最早的加密和解密是共用一个密码的,加密的时候用一个<br/>密码把信息打乱,解密的时候就必须用同样的密码把信息还原<br/>这种方式很适合用来保存一些自己的文件<br/>你可以把你的文件加密起来存到硬盘甚至可以上传到网络硬盘<br/>即使有人盗取到了你的文件,他要是没有密码也是白费力气<br/>但是日常生活中我们往往需要运用加密的手段传递一些<br/>需要保密的消息。这个时候这种原始的加密方法就有点不适用了<br/>例如你把一条重要的消息加密起来发送给你的朋友<br/>你的朋友要是不知道你加密的时候使用了什么密码<br/>他就不知道你想表达什么,你要是把密码也发送给他<br/>那么密码在到达你朋友手里之前就可能已经被很多人看到了<br/>你的保密消息就变成了公开消息了<br/>这是一个难题,但是上天给我们一个难题之后一般会给一个答案<br/>非对称密码就是这个难题的答案<br/>所谓 非对称密码 是相对于 对称密码 来讲的<br/>原先加密解密用同一个密码看起来好像是对称的<br/>现在加密和解密用不同的密码,我们就叫它 非对称密码<br/>这种加密方法用到两个密码,它们是成对出现的<br/>其中一个密码叫做 公钥 另一个叫 私钥<br/>使用私钥加密的东西可以用私钥来解密同时也能用公钥来解密<br/>但是使用公钥加密的东西却不能用公钥来解密<br/>而是需要用私钥来解。正是由于这个特点公钥是可以公开的<br/>你可以让所有人都知道你的公钥。但是私钥就需要绝对保密<br/>一般来讲需要保密的东西最好是记在脑子里,这样谁也拿不走<br/>但是由于公钥实在太长了基本没人能记得住,所以我们需要<br/>把它保存到硬盘或者存储卡里面,直接保存当然不安全<br/>我们需要用对称密码的方式将私钥加密起来保存<br/>这样你只需要设置一个不是特别长的能记住的密码<br/>然后你就可以用这个不是特别长的密码<br/>解密还原那个很长不好记的私钥,再用这个私钥来解密还原<br/>你的朋友发送给你的机密消息</p><p>再讲一下本程序的应用场景<br/>比如你要把你的某个重要的账号和密码发送给你的朋友<br/>直接用短信或者微信发总归不安全<br/>这时候我们这个小程序就能起到很好的辅助作用<br/>你的朋友需要运用本程序创建一对公钥和私钥<br/>然后把他的公钥发送给你,这时候你就可以用他的公钥<br/>来加密你的账号名称以及密码,然后把加密之后的那堆东西复制下来<br/>发送给你的朋友,他收到以后就能用他的私钥来解密<br/>还原出你的账号名称以及密码,整个过程不会有第三个人<br/>可以知道你的账号名称以及密码</p><p>我们把这种消息的传递方式形象的称为隧道模式<br/>就仿佛有一条看神秘的隧道建立在你和你的朋友之间<br/>周围的人都知道你们做了些什么却不明白其中真意<br/>因为你们的真实意思是通过那条神秘隧道来传递的<br/>我有一个比喻来形容这种传递消息的方式<br/>好比两个很有默契的人在一个公共场合说了一些话<br/>我们可以看到他们的每一个动作听到他们的每一句话<br/>但是却不明白他们真正表达的意思是什么<br/>因为这是专属于他们两人之间的默契<br/>在互联网的环境下运用公钥和私钥的加密方式<br/>其实就可以在任意两个人之间建立起这种“默契”</p></body></html>


RSA加密和解密:
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" /><script language="JavaScript" type="text/javascript" src="cryptico.browser.js"></script><title>RSA加密和解密</title></head><body><script type="text/javascript">if(typeof FileReader == 'undefined'){var div=document.getElementById("dd");div.innerHTML='你的浏览器不支持FileReader接口!';document.getElementById("file").setAttribute("disabled","disabled");document.getElementById("filea").setAttribute("disabled","disabled");document.getElementById("fileb").setAttribute("disabled","disabled");}function textShow(fileElementId, textElementId){var file=document.getElementById(fileElementId).files[0];if(file){var reader=new FileReader();reader.onload=function(e){var conb=document.getElementById(textElementId);conb.innerHTML=e.target.result;}}reader.readAsText(file);}function rsaEncrypt(keyForPrivate,privateKeyString,publicKeyString,plainText){var rsaKey = cryptico.privateKeyFromString(privateKeyString,keyForPrivate);var EncryptionResult = cryptico.encrypt(plainText, publicKeyString,rsaKey);return EncryptionResult.cipher; }function rsaDecrypt(keyForPrivate,privateKeyString,cipherText){var rsaKey = cryptico.privateKeyFromString(privateKeyString,keyForPrivate);var DecryptionResult = cryptico.decrypt(cipherText, rsaKey);return DecryptionResult; }function showE(){var publicKey=document.getElementById("publicKey").value;var plainText=escape(document.getElementById("textIn").value);var keyForPrivate=document.getElementById("keyForPrivate").value;var privateKey=document.getElementById("privateKey").value;   var aesKey = cryptico.string2bytes(cryptico.b64to256("L7UotmZPW5e1DFI3xEN1Y2jfLatPhtNNRNL2Zb/TyUE="));aesKey = cryptico.string2bytes(cryptico.b64to256(cryptico.encryptAESECB(escape(keyForPrivate), aesKey)));aesKey = aesKey.slice(0, 16);var mi=rsaEncrypt(aesKey,privateKey,publicKey,plainText);document.getElementById("textOut").value=mi;var myDiv=document.getElementById("msg");myDiv.innerText="你的ID:"+cryptico.publicKeyID(publicKey);}function showD(){var keyForPrivate=document.getElementById("keyForPrivate").value;var privateKey=document.getElementById("privateKey").value;var cipherText=document.getElementById("textIn").value;var aesKey = cryptico.string2bytes(cryptico.b64to256("L7UotmZPW5e1DFI3xEN1Y2jfLatPhtNNRNL2Zb/TyUE="));aesKey = cryptico.string2bytes(cryptico.b64to256(cryptico.encryptAESECB(escape(keyForPrivate), aesKey)));aesKey = aesKey.slice(0, 16);var result=rsaDecrypt(aesKey,privateKey,cipherText);document.getElementById("textOut").value = unescape(result.plaintext);var myDiv=document.getElementById("msg");myDiv.innerText="对方的ID:"+cryptico.publicKeyID(result.publicKeyString)+"\n\n数字签名(verified代表签名正确,forged代表签名错误):"+result.signature+"\n\n\n对方的公钥:\n"+result.publicKeyString;}</script> <div id="dd"> </div><p>在下方输入你创建密钥时设置的密码:<br/><input type="password" name="keyForPrivate" id="keyForPrivate"></><p>点击下方按钮选择 对方的 公钥文件:<br/><input type="file" style='font-size:20px' name="filePublicKey" id='filePublicKey' onchange='textShow("filePublicKey","publicKey")'/></p><textarea name="publicKey" rows="5" cols="30" id="publicKey"></textarea><p>点击下方按钮选择 你的 私钥文件:<br/><input type="file" style='font-size:20px' name="filePrivateKey" id='filePrivateKey' onchange='textShow("filePrivateKey","privateKey")'/></p><textarea name="privateKey" rows="5" cols="30" id="privateKey"></textarea><p>在下框输入要加密或者要解密的内容:<br/><textarea name="textIn" rows="5" cols="30" id="textIn"></textarea></><p><button style='font-size:20px' onclick="showE()">点我进行加密</button>  <button style='font-size:20px' onclick="showD()">点我进行解密</button></><p>下框将会输出加密或者解密后的内容:<br/><textarea name="textOut" rows="5" cols="30" id="textOut"></textarea></><p>加密的时候需要对方的公钥以及自己的私钥<br/>只是解密的话有自己的私钥就可以了</p><p id="msg"></p></body></html>


0 0
原创粉丝点击