一些簡單的JavaScript加密/解密

Presbyterian發表於2018-03-07

UTF8編碼與解碼:

    function encodeUTF8(str){
        var temp = "",rs = "";
        for( var i=0 , len = str.length; i < len; i++ ){
            temp = str.charCodeAt(i).toString(16);
            rs  += "\\u"+ new Array(5-temp.length).join("0") + temp;
        }
        return rs;
    }
    function decodeUTF8(str){
        return str.replace(/(\\u)(\w{4}|\w{2})/gi, function($0,$1,$2){
            return String.fromCharCode(parseInt($2,16));
        });
    }
    console.log(encodeUTF8("123olp=-+*/中國"));
    console.log(decodeUTF8(encodeUTF8("123olp=-+*/中國")));

結果:
\u0031\u0032\u0033\u006f\u006c\u0070\u003d\u002d\u002b\u002a\u002f\u4e2d\u56fd
123olp=-+*/中國

字串轉16進位制

//(只能是英文數字,不能是漢字等,編碼出來亂碼)
 function strToHexCharCode(str) {
        if(str === "")
            return "";
        var hexCharCode = [];
        hexCharCode.push("0x");
        for(var i = 0; i < str.length; i++) {
            hexCharCode.push((str.charCodeAt(i)).toString(16));
        }
        return hexCharCode.join("");
    }
    console.log(strToHexCharCode("ss11*-+中國人民"));
    //16進位制轉字串

    function hexCharCodeToStr(hexCharCodeStr) {
        var trimedStr = hexCharCodeStr.trim();
        var rawStr = trimedStr.substr(0,2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
        var len = rawStr.length;
        if(len % 2 !== 0) {
            alert("Illegal Format ASCII Code!");
            return "";
        }
        var curCharCode;
        var resultStr = [];
        for(var i = 0; i < len;i = i + 2) {
            curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
            resultStr.push(String.fromCharCode(curCharCode));
        }
        return resultStr.join("");
    }
    console.log(hexCharCodeToStr(strToHexCharCode("ss11*-+中國人民")));

結果:
0x737331312a2d2b4e2d56fd4eba6c11
ss11*-+N-VýNºl

ASCII與Base64轉換

    let encodedData = window.btoa("ss11*-+999"); // 編碼//ascii->base64  //(只能是英文數字,不能是漢字等,如果是漢字就報錯)
    let decodedData = window.atob(encodedData); // 解碼//base64->ascii
        console.log(encodedData);
        console.log(decodedData);

結果:
c3MxMSotKzk5OQ==
ss11*-+999

利用escape()函式

    //escape() 函式可對字串進行編碼,這樣就可以在所有的計算機上讀取該字串。
    // 該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: * @ - _ + . / 。其他所有的字元都會被轉義序列替換。
    //也就是說不能編碼網址等
    var b=escape("中國人112ppp*-/++-`www.baidu.com");
    console.log(b);
    console.log(unescape(b));

結果:
%u4E2D%u56FD%u4EBA112ppp*-/++-%60www.baidu.com
中國人112ppp*-/++-`www.baidu.com

簡單的加密解密的函式

function compile(code) {
        var c=String.fromCharCode(code.charCodeAt(0)+code.length);
        for(var i=1;i<code.length;i++){
            c+=String.fromCharCode(code.charCodeAt(i)+code.charCodeAt(i-1));
        }
        return(escape(c));
    }
    function uncompile(code) {
        code=unescape(code);
        var c=String.fromCharCode(code.charCodeAt(0)-code.length);
        for(var i=1;i<code.length;i++){
            c+=String.fromCharCode(code.charCodeAt(i)-c.charCodeAt(i-1));
        }
        return c;
    }
    console.log(compile("ji45+-*積極"));
    console.log((uncompile(compile("ji45+-*積極"))));

結果:
s%D3%9Di%60XW%u7A19%uE170
ji45+-*積極


這裡是結合上面的函式例子,簡單些的一個加密函式,先用charCodeAt()方法可返回指定位置的字元的 Unicode 編碼。這個返回值是 0 - 65535 之間的整數,將傳入的值轉為字串,然後用escape函式進行加密。解密使用的是unescape。然後再用String.fromCharCode(numX,numX,...,numX)方法(可接受一個指定的 Unicode 值,然後返回一個字串。)解密。
下載連結自己的加密解密函式

相關文章