字符串加密和解密的關鍵是算法設計,字符串經過復雜的編碼處理,返回一組看似雜亂無章的字符串。對於常人來說,輸入的字符串是可以閱讀的信息,但是被函數打亂或編碼之后顯示的字符串就會變成無意義的信息。想要把這些垃圾信息變成可用信息,還需要使用相反的算法把它們逆轉回來。
如果把字符串中的“中”字進行自定義加密。可以考慮利用 charCodeAt() 方法獲取該字符的 Unicode 編碼。
var s = "中"; var b = s.charCodeAt(0); //返回值20013
然后以 36 為倍數不斷取余數。
b1 = b % 36; //返回值33,求余數 b = (b - b1) / 36; //返回值555,求倍數 b2 = b % 36; //返回值15,求余數 b = (b - b2) / 36; //返回值15,求倍數 b3 = b % 36; //返回值15,求余數
那么不斷求得的余數,可以通過下面公式反算出原編碼值
var m = b3 * 36 * 36 + b2 * 36 + b1; //返回值20013,反求字符“中”的編碼值
有了這種算法,就可以實現字符與加密數值之間的相互轉換。
定義一串密鑰:
var key = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
把余數定位到與密鑰中某個下標值相等的字符上,這樣就實現了加密效果。反過來,如果知道某個字符在密鑰中的下標值,然后反算出被加密字符的 Unicode 編碼值,最后就可以逆推出被加密字符的原信息。
本例設定密鑰是以 36 個不同的數值和字母組成的字符串。不同的密鑰,加密解密的結果是不同的,加密結果以密鑰中的字符作為基本元素。
<script> var toCode = function (str,key) { //加密字符串 //定義密鑰,36個字母和數字 var l = key.length; //獲取密鑰的長度 var a = key.split(""); //把密鑰字符串轉換為字符數組 var s = "",b, bl, b2, b3; //定義臨時變量 for (var i = 0; i <str.length; i ++) { //遍歷字符串 b = str.charCodeAt(i); //逐個提取每個字符,並獲取Unicode編碼值 bl = b % l; //求Unicode編碼值得余數 b = (b - bl) / l; //求最大倍數 b2 = b % l; //求最大倍數的於是 b = (b - b2) / l; //求最大倍數 b3 = b % l; //求最大倍數的余數 s += a[b3] + a[b2] + a[bl]; //根據余數值映射到密鑰中對應下標位置的字符 } return s; //返回這些映射的字符 } var fromCode = function (str,key) { //定義密鑰,36個字母和數字 var l = key.length; //獲取密鑰的長度 var b, bl, b2, b3, d = 0, s; //定義臨時變量 s = new Array(Math.floor(str.length / 3)); //計算加密字符串包含的字符數,並定義數組 b = s.length; //獲取數組的長度 for (var i = 0; i < b; i ++) { //以數組的長度循環次數,遍歷加密字符串 bl = key.indexOf(str.charAt(d)); //截取周期內第一個字符串,計算在密鑰中的下標值 d ++; b2 = key.indexOf(str.charAt(d)); //截取周期內第二個字符串,計算在密鑰中的下標值 d ++; b3 = key.indexOf(str.charAt(d)); //截取周期內第三個字符串,計算在密鑰中的下標值 d ++; s[i] = bl * l * l + b2 * l + b3 //利用下標值,反推被加密字符的Unicode編碼值 } b = eval("String.fromCharCode(" + s.join(',') + ")");//用fromCharCode()算出字符串 return b ; //返回被解密的字符串 } var key = "0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var s = "JavaScript 中國"; //字符串直接量 s = toCode(s,key); //加密字符串 console.log(s); //返回“02Y02P03A02 P03702R03602X034038FFXH6L” s = fromCode(s,key); //解密被加密的字符串 console.log(s); //返回字符串“JavaScript 中國” var key = "0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZZZZ"; var s = "加密字符串"; //字符串直接量 s = toCode(s,key); //加密字符串 console.log(s); s = fromCode(s,key); //解密被加密的字符串 console.log(s); //返回字符串“JavaScript 中國” </script>