﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-emu in blogjava</title><link>http://www.blogjava.net/emu/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 13 Jun 2026 13:12:41 GMT</lastBuildDate><pubDate>Sat, 13 Jun 2026 13:12:41 GMT</pubDate><ttl>60</ttl><item><title>极简的switch控件</title><link>http://www.blogjava.net/emu/archive/2019/10/02/434717.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Tue, 01 Oct 2019 22:45:00 GMT</pubDate><guid>http://www.blogjava.net/emu/archive/2019/10/02/434717.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/434717.html</wfw:comment><comments>http://www.blogjava.net/emu/archive/2019/10/02/434717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/434717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/434717.html</trackback:ping><description><![CDATA[<span style="caret-color: #444444; color: #444444; font-family: Tahoma, Arial, Helvetica, sans-serif; background-color: #ffffff;">需要在html页面上用到一个switch控件，html5没有现成的，网上流传的版本都有点复杂，代码量偏大甚至有独立的css和js片段的依赖，用起来不像html控件那么简单，有一些动画之类的需求镀金也不是太必要，随手写个极简版的用着：</span>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">pre&nbsp;</span><span style="color: #FF0000; ">onclick</span><span style="color: #0000FF; ">="this.c=!this.c;style.backgroundColor=c?'green':'';innerHTML=c?'on&nbsp;&nbsp;&nbsp;&#9675;':'&#9675;&nbsp;&nbsp;off'"</span><span style="color: #FF0000; "><br />
style</span><span style="color: #0000FF; ">="border-radius:0.7em;border:1px&nbsp;solid&nbsp;black;padding:0&nbsp;0.4em;display:inline;float:right"</span><span style="color: #0000FF; ">&gt;</span>&#9675;&nbsp;&nbsp;off<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">pre</span><span style="color: #0000FF; ">&gt;</span></div>
</div>
<div>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; list-style-type: none; list-style-image: none; caret-color: #444444; color: #444444; font-family: Tahoma, Arial, Helvetica, sans-serif;">用pre控件一是为了让字体等宽避免宽度的微小变化，二是可以方便的填空格进去调整宽度而不用填&amp;nbsp;</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; list-style-type: none; list-style-image: none; caret-color: #444444; color: #444444; font-family: Tahoma, Arial, Helvetica, sans-serif;">打开关闭状态可以通过读取元素的c属性，当然也可以直接用标记相应属性的全局变量来代替，免去了再读取元素属性的麻烦:</p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="background-color: #f5f5f5;"><br />
</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;switchState;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">pre&nbsp;</span><span style="color: #FF0000; ">onclick</span><span style="color: #0000FF; ">="style.backgroundColor=(switchState=!switchState)?'green':'';innerHTML=switchState?'on&nbsp;&nbsp;&nbsp;&#9675;':'&#9675;&nbsp;&nbsp;off'"</span><span style="color: #FF0000; "><br />
style</span><span style="color: #0000FF; ">="border-radius:0.7em;border:1px&nbsp;solid&nbsp;black;padding:0&nbsp;0.4em;display:inline;"</span><span style="color: #0000FF; ">&gt;</span>&#9675;&nbsp;&nbsp;off<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">pre</span><span style="color: #0000FF; ">&gt;</span></div>
</div><img src ="http://www.blogjava.net/emu/aggbug/434717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2019-10-02 06:45 <a href="http://www.blogjava.net/emu/archive/2019/10/02/434717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整理了最近百年的藏历数据，做了个公历藏历映射的小工具</title><link>http://www.blogjava.net/emu/archive/2019/01/30/433627.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Wed, 30 Jan 2019 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/emu/archive/2019/01/30/433627.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/433627.html</wfw:comment><comments>http://www.blogjava.net/emu/archive/2019/01/30/433627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/433627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/433627.html</trackback:ping><description><![CDATA[@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
过去三年一直都在每年藏历新年前设法拿到新一年的藏历数据更新到自己的<a href="https://github.com/stonelf/zangli">一个gihub项目</a>里面，今年临近藏历新年，却发现以往的很多藏历网站都没有更新明年的数据了，正好弄到了最近一百年的藏历数据，花了点时间全部都更新了进去，顺便<span style="caret-color: #444444; color: #444444; font-family: Tahoma, Arial, Helvetica, sans-serif; background-color: #ffffff;">申请了一个还不错的域名 zangli.pro，&nbsp;</span>发布了一个新网站<a href="https://www.zangli.pro">百年藏历</a>，方便大家随时查询或者在自己的产品中直接引用藏历公历的换算脚本。<img src ="http://www.blogjava.net/emu/aggbug/433627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2019-01-30 13:34 <a href="http://www.blogjava.net/emu/archive/2019/01/30/433627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用webcrypto做AES原生加解密</title><link>http://www.blogjava.net/emu/archive/2017/06/12/432595.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Mon, 12 Jun 2017 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/emu/archive/2017/06/12/432595.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/432595.html</wfw:comment><comments>http://www.blogjava.net/emu/archive/2017/06/12/432595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/432595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/432595.html</trackback:ping><description><![CDATA[今天下午和<a href="https://user.qzone.qq.com/502597324">一个妹子</a>聊到在前端做AES加密，妹子说有一些开源的库，我想webcrypto提出来这么多年，应该<a href="http://caniuse.com/#search=crypto">主流浏览器很多也应该有原生的支持</a>了吧？写个加测试页面试试看：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;!</span><span style="color: #FF00FF; ">DOCTYPE&nbsp;html</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">html</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">head</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">META&nbsp;</span><span style="color: #FF0000; ">NAME</span><span style="color: #0000FF; ">="Author"</span><span style="color: #FF0000; ">&nbsp;CONTENT</span><span style="color: #0000FF; ">="emu"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">META&nbsp;</span><span style="color: #FF0000; ">NAME</span><span style="color: #0000FF; ">="Keywords"</span><span style="color: #FF0000; ">&nbsp;CONTENT</span><span style="color: #0000FF; ">="webcrypto&nbsp;AES-CBC&nbsp;AES-GCM"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">head</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">body</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="out"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script&nbsp;</span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text/javascript"</span><span style="color: #0000FF; ">&gt;</span><span style="background-color: #f5f5f5;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">&nbsp;output(sign)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">out</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">).innerHTML&nbsp;</span><span style="background-color: #f5f5f5;">+=</span><span style="background-color: #f5f5f5;">&nbsp;sign&nbsp;</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&lt;br&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">&nbsp;bufferToHex(b){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;dataview&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #f5f5f5;">&nbsp;DataView(b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">""</span><span style="background-color: #f5f5f5;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">for</span><span style="background-color: #f5f5f5;">&nbsp;(</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;i&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">0</span><span style="background-color: #f5f5f5;">;&nbsp;i&nbsp;</span><span style="background-color: #f5f5f5;">&lt;</span><span style="background-color: #f5f5f5;">&nbsp;b.byteLength;&nbsp;i&nbsp;</span><span style="background-color: #f5f5f5;">+=</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">4</span><span style="background-color: #f5f5f5;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;dataview.getUint32(i).toString(</span><span style="background-color: #f5f5f5;">16</span><span style="background-color: #f5f5f5;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="background-color: #f5f5f5;">+=</span><span style="background-color: #f5f5f5;">&nbsp;(tmp.length&nbsp;</span><span style="background-color: #f5f5f5;">==</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">8</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">?</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">""</span><span style="background-color: #f5f5f5;">&nbsp;:&nbsp;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">0</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">)&nbsp;</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;tmp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">return</span><span style="background-color: #f5f5f5;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">&nbsp;bufferToString(b){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">new&nbsp;TextDecoder().decode(b)</span><span style="background-color: #F5F5F5; color: #008000; "><br />
</span><span style="background-color: #f5f5f5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;hex</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">bufferToHex(b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;result</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">unescape(hex.replace(</span><span style="background-color: #f5f5f5;">/</span><span style="background-color: #f5f5f5;">(..)</span><span style="background-color: #f5f5f5;">/</span><span style="background-color: #f5f5f5;">g,</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">%$1</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">return</span><span style="background-color: #f5f5f5;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">&nbsp;stringToBuffer(s){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">new&nbsp;TextEncoder().encode(s);</span><span style="background-color: #F5F5F5; color: #008000; "><br />
</span><span style="background-color: #f5f5f5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;a&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;s.split(</span><span style="background-color: #f5f5f5;">""</span><span style="background-color: #f5f5f5;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">for</span><span style="background-color: #f5f5f5;">&nbsp;(</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;i&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">0</span><span style="background-color: #f5f5f5;">;&nbsp;i&nbsp;</span><span style="background-color: #f5f5f5;">&lt;</span><span style="background-color: #f5f5f5;">&nbsp;a.length;&nbsp;i</span><span style="background-color: #f5f5f5;">++</span><span style="background-color: #f5f5f5;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;a[i].charCodeAt(</span><span style="background-color: #f5f5f5;">0</span><span style="background-color: #f5f5f5;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;result&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #f5f5f5;">&nbsp;Uint8Array(a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">return</span><span style="background-color: #f5f5f5;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;textToBeEncrypted&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;'Hello&nbsp;World</span><span style="background-color: #f5f5f5;">!</span><span style="background-color: #f5f5f5;">';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;bufferToBeEncrypted</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">stringToBuffer(textToBeEncrypted);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;bufferToBeDecrypted;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;pwd</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">let&nbsp;me&nbsp;try&nbsp;this&nbsp;password</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;password&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;stringToBuffer(pwd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;sAlg</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">AES-CBC</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">AES-GCM部分浏览器不支持</span><span style="background-color: #F5F5F5; color: #008000; "><br />
</span><span style="background-color: #f5f5f5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;c&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;window.crypto&nbsp;</span><span style="background-color: #f5f5f5;">||</span><span style="background-color: #f5f5f5;">&nbsp;window.msCrypto;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;subtle&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;c.subtle&nbsp;</span><span style="background-color: #f5f5f5;">||</span><span style="background-color: #f5f5f5;">&nbsp;c.webkitSubtle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;iv&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;c.getRandomValues(</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #f5f5f5;">&nbsp;Uint8Array(</span><span style="background-color: #f5f5f5;">16</span><span style="background-color: #f5f5f5;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;alg&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;{&nbsp;name:&nbsp;sAlg,&nbsp;iv:&nbsp;iv&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;op</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">c.subtle.digest('SHA</span><span style="background-color: #f5f5f5;">-</span><span style="background-color: #f5f5f5;">256</span><span style="background-color: #f5f5f5;">',&nbsp;password)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;encryptKey,decryptKey,hash;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">if</span><span style="background-color: #f5f5f5;">((</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">then</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">in</span><span style="background-color: #f5f5f5;">&nbsp;op)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.then(</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(buffer){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">buffer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.subtle.importKey('raw',&nbsp;hash,&nbsp;alg,&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">false</span><span style="background-color: #f5f5f5;">,&nbsp;['encrypt']).then(</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(buffer){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encryptKey</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">buffer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.subtle.importKey('raw',&nbsp;hash,&nbsp;alg,&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">false</span><span style="background-color: #f5f5f5;">,&nbsp;['decrypt']).then(</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(buffer){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decryptKey</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">buffer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doEncrypt(alg,encryptKey);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="background-color: #F5F5F5; color: #0000FF; ">else</span><span style="background-color: #f5f5f5;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.oncomplete</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;hash</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">e.target.result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;op</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">c.subtle.importKey('raw',&nbsp;hash,&nbsp;alg,&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">false</span><span style="background-color: #f5f5f5;">,&nbsp;['encrypt']);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.oncomplete</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encryptKey</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">e.target.result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">c.subtle.importKey('raw',&nbsp;hash,&nbsp;alg,&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">false</span><span style="background-color: #f5f5f5;">,&nbsp;['decrypt']);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.oncomplete</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decryptKey</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">e.target.result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encryptWithCryptoOperation(alg,encryptKey);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">&nbsp;doEncrypt(alg,encryptKey){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;op&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;c.subtle.encrypt(alg,&nbsp;encryptKey,&nbsp;bufferToBeEncrypted);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.then(</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(buffer){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bufferToBeDecrypted</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">buffer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">pwd:&nbsp;&lt;b&gt;&lt;i&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">pwd</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&lt;/i&gt;&lt;/b&gt;&nbsp;alg:&lt;b&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">sAlg</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&lt;/b&gt;&nbsp;&lt;br&gt;encrypt(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">textToBeEncrypted&nbsp;</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">)=</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;bufferToHex(buffer));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doDecrypt(alg,decryptKey);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">&nbsp;doDecrypt(alg,decryptKey){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;op&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;c.subtle.decrypt(alg,&nbsp;decryptKey,&nbsp;bufferToBeDecrypted);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.then(</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(buffer){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">pwd:&lt;b&gt;&lt;i&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">pwd</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&lt;/i&gt;&lt;/b&gt;&nbsp;&nbsp;alg:&lt;b&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">sAlg</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&lt;/b&gt;&nbsp;&lt;br&gt;decrypt(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">bufferToHex(bufferToBeDecrypted)&nbsp;</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">)=</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;bufferToString(buffer));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">&nbsp;encryptWithCryptoOperation(alg,encryptKey){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;op&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;c.subtle.encrypt(alg,&nbsp;encryptKey);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.onerror</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(e){output(sAlg</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&nbsp;&nbsp;unsupported</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">)}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.process(bufferToBeEncrypted);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.oncomplete</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bufferToBeDecrypted</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">e.target.result<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">pwd:&nbsp;&lt;b&gt;&lt;i&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">pwd</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&lt;/i&gt;&lt;/b&gt;&nbsp;alg:&lt;b&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">sAlg</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&lt;/b&gt;&nbsp;&lt;br&gt;encrypt(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">textToBeEncrypted&nbsp;</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">)=</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;bufferToHex(bufferToBeDecrypted));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">decryptWithCryptoOperation(alg,decryptKey)</span><span style="background-color: #F5F5F5; color: #008000; "><br />
</span><span style="background-color: #f5f5f5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTimeout(decryptWithCryptoOperation,</span><span style="background-color: #f5f5f5;">0</span><span style="background-color: #f5f5f5;">,alg,decryptKey)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.finish();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">&nbsp;decryptWithCryptoOperation&nbsp;&nbsp;(alg,decryptKey){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5;">&nbsp;op&nbsp;</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #f5f5f5;">&nbsp;c.subtle.decrypt(alg,&nbsp;decryptKey);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.onerror</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(e){(sAlg</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&nbsp;&nbsp;unsupported</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">)}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.process(bufferToBeDecrypted);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.oncomplete</span><span style="background-color: #f5f5f5;">=</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5;">(e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">if</span><span style="background-color: #f5f5f5;">(</span><span style="background-color: #f5f5f5;">!</span><span style="background-color: #f5f5f5;">e.target.result){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">IE&nbsp;is&nbsp;crazy!&lt;br&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encryptWithCryptoOperation(alg,encryptKey)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="background-color: #F5F5F5; color: #0000FF; ">else</span><span style="background-color: #f5f5f5;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">pwd:&lt;b&gt;&lt;i&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">pwd</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&lt;/i&gt;&lt;/b&gt;&nbsp;&nbsp;alg:&lt;b&gt;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">sAlg</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">&lt;/b&gt;&nbsp;&lt;br&gt;decrypt(</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">bufferToHex(bufferToBeDecrypted)&nbsp;</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">)=</span><span style="background-color: #f5f5f5;">"</span><span style="background-color: #f5f5f5;">+</span><span style="background-color: #f5f5f5;">&nbsp;bufferToString(e.target.result));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.finish();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">body</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">html</span><span style="color: #0000ff;">&gt;</span></div>
<br />
测试下来感觉各个浏览器支持程度还是参差不齐，IE11和Edge都是不同的实现方式，IE11甚至还会随机出现oncomplete的时候result数据都还没有ready的情况，甚至于有的时候完全相同的入参（包括随机数也相同）加密出来的结果居然会不同，也就是说有的时候加密算法自己会加密错，出来的结果根本就无法被正确解密，实在是个半成品：<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/emu/QQ图片20170612191317.png" border="0" alt="" /><br />
（第一次加密错了，第二次加密对了解密错了，第三次终于加解密都对了）<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/emu/QQ截图20170612191658.png" alt="" /><br />（第一次加密错了，第二次对了）<br />
<img src ="http://www.blogjava.net/emu/aggbug/432595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2017-06-12 17:48 <a href="http://www.blogjava.net/emu/archive/2017/06/12/432595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用优图继续优化论坛</title><link>http://www.blogjava.net/emu/archive/2016/02/27/429464.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Sat, 27 Feb 2016 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/emu/archive/2016/02/27/429464.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/429464.html</wfw:comment><comments>http://www.blogjava.net/emu/archive/2016/02/27/429464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/429464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/429464.html</trackback:ping><description><![CDATA[@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
上篇讲到因为经常有流量冲击，因此采用了流量结算方式。后来发现流量波动的有点不合理了，分析CDN访问日志发现，绝大多数的流量都是论坛有一些用户上传了超大图片浪费掉的，要解决这个问题，就要压缩一下图片了。腾讯云提供的解决方案是优图。老规矩，懒得修改程序，加一个rewrite：
<div><img src="http://www.blogjava.net/images/blogjava_net/emu/配置0227.png" width="908" alt="" /><br />
</div>
<div><br />
</div>
<div>加好后，流量唰唰唰的就掉下来了：</div>
<div><br />
</div>
<div><br />
</div>
<div>
<div>
<div><br />
<div><br />
</div>
<div><img src="http://www.blogjava.net/images/blogjava_net/emu/流量0227.png" width="908" alt="" /><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div>每天流量从20G～30G下降到1G以下，相应的优图流量也上到接近2G。</div>
<div><img src="http://www.blogjava.net/images/blogjava_net/emu/优图0227.png" width="908" height="501" alt="" /><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div>哎呀，前面买了个大流量包这下怎么用的完啊？</div>
<div><br />
</div>
<div><br />
</div>
</div>
</div>
</div><img src ="http://www.blogjava.net/emu/aggbug/429464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2016-02-27 20:21 <a href="http://www.blogjava.net/emu/archive/2016/02/27/429464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用腾讯云优化一个公益论坛</title><link>http://www.blogjava.net/emu/archive/2016/02/19/429374.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Fri, 19 Feb 2016 09:56:00 GMT</pubDate><guid>http://www.blogjava.net/emu/archive/2016/02/19/429374.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/429374.html</wfw:comment><comments>http://www.blogjava.net/emu/archive/2016/02/19/429374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/429374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/429374.html</trackback:ping><description><![CDATA[@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
<span style="margin: 0px; padding: 0px; font-family: 'Times New Roman'; font-size: 24pt; background-color: #ffffff;">〇、背景</span><br style="color: #ff8000; font-family: punctuation, 微软雅黑, Tohoma; line-height: 22.4px; background-color: #ffffff;" />
<br style="color: #ff8000; font-family: punctuation, 微软雅黑, Tohoma; line-height: 22.4px; background-color: #ffffff;" />
<span style="margin: 0px; padding: 0px; font-family: 'Times New Roman'; line-height: 22.4px; font-size: 12pt; background-color: #ffffff;">&nbsp; &nbsp; &nbsp; &nbsp;几年前由于发起寻亲项目的关系，和B网站开展了合作。B网站是国内最大的寻亲网站，几年来通过该网站和家人团聚的案例已经达到1397例。B论坛是网站中最活跃的板块。当时论坛遇到一些不稳定的情况，因为B论坛是用Discuz！搭建的，而Discuz！当时刚好被腾讯收购，要获得专业支持相对容易，我们开始把B论坛迁移到腾讯云上面，由Discuz！的志愿者协助维护直到去年底离职，把论坛的管理权限交给我。<br />
<br />
</span><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman'; font-size: 24pt; background-color: #ffffff;">一、论坛出问题了</span><br style="color: #ff8000; font-family: punctuation, 微软雅黑, Tohoma; line-height: 22.4px; background-color: #ffffff;" />
<br style="color: #ff8000; font-family: punctuation, 微软雅黑, Tohoma; line-height: 22.4px; background-color: #ffffff;" />
<span style="margin: 0px; padding: 0px; font-family: 'Times New Roman'; line-height: 22.4px; font-size: 12pt; background-color: #ffffff;">&nbsp; &nbsp; &nbsp; 我不对于php和linux都不熟，交接后看到论坛工作还算正常，也很长一段时间没有去关注，直到前几天，网站管理员突然发来了这个：<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/emu/1.png" width="800" height="539" alt="" /><br />
</span><br style="color: #ff8000; font-family: punctuation, 微软雅黑, Tohoma; line-height: 22.4px; background-color: #ffffff;" />
<br style="color: #ff8000; font-family: punctuation, 微软雅黑, Tohoma; line-height: 22.4px; background-color: #ffffff;" />
<span style="margin: 0px; padding: 0px; font-family: 'Times New Roman'; line-he