JS自己實現字符串加密和解密算法


字符串加密和解密的關鍵是算法設計,字符串經過復雜的編碼處理,返回一組看似雜亂無章的字符串。對於常人來說,輸入的字符串是可以閱讀的信息,但是被函數打亂或編碼之后顯示的字符串就會變成無意義的信息。想要把這些垃圾信息變成可用信息,還需要使用相反的算法把它們逆轉回來。

如果把字符串中的“中”字進行自定義加密。可以考慮利用 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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM