JavaScript Base64加解密

Base64加密算法是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

下面是Base64加密、解密算法的简单实现(不支持中文):

function base64Encrypt(baseString) {
    var base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var length = baseString.length;
    var loopNo = parseInt(length / 3);
    var charOne, charTwo, charThree;
    var out = "";
    for (var i = 0, j = 0; j < loopNo; j++) {
        charOne = baseString.charCodeAt(i++);
        charTwo = baseString.charCodeAt(i++);
        charThree = baseString.charCodeAt(i++);
        out += base64Chars.charAt(charOne >> 2);
        out += base64Chars.charAt(((charOne & 0x3) << 4) | ((charTwo & 0xF0) >> 4));
        out += base64Chars.charAt(((charTwo & 0xF) << 2) | ((charThree & 0xC0) >> 6));
        out += base64Chars.charAt(charThree & 0x3F);
    }
    if (i === length) {
        return out;
    }
    charOne = baseString.charCodeAt(i++) & 0xff;
    out += base64Chars.charAt(charOne >> 2);
    if (i === length) {
        out += base64Chars.charAt((charOne & 0x3) << 4);
        out += "==";
    } else {
        charTwo = baseString.charCodeAt(i++);
        out += base64Chars.charAt(((charOne & 0x3) << 4) | ((charTwo & 0xF0) >> 4));
        out += base64Chars.charAt((charTwo & 0xF) << 2);
        out += "=";
    }
    return out;
}

function base64Encode(baseSting) {
    var base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var length = baseSting.length;
    var chara1, chara2, chara3;
    var out = "", i = 0;
    while (i < length) {
        chara1 = baseSting.charCodeAt(i++) & 0xff;
        out += base64Chars.charAt(chara1 >> 2);
        if (i == length) {
            out += base64Chars.charAt((chara1 & 0x3) << 4);
            out += "==";
            break;
        }
        chara2 = baseSting.charCodeAt(i++);
        if (i == length) {
            out += base64Chars.charAt(((chara1 & 0x3) << 4) | ((chara2 & 0xF0) >> 4));
            out += base64Chars.charAt((chara2 & 0xF) << 2);
            out += "=";
            break;
        }
        chara3 = baseSting.charCodeAt(i++);
        out += base64Chars.charAt(((chara1 & 0x3) << 4) | ((chara2 & 0xF0) >> 4));
        out += base64Chars.charAt(((chara2 & 0xF) << 2) | ((chara3 & 0xC0) >> 6));
        out += base64Chars.charAt(chara3 & 0x3F);
    }
    return out;
}

function base64Decode(baseString) {
    var base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var length = baseString.length;
    var charI, charII, charIII, charIV;
    var out = "", i = 0;
    if (0 < length && 0 === length % 4) {
        if (/^[A-Za-z0-9+/]{2,}={0,2}$/.test(baseString)) {
            while (i < length - 4) {
                charI = base64Chars.indexOf(baseString.charAt(i++));
                charII = base64Chars.indexOf(baseString.charAt(i++));
                charIII = base64Chars.indexOf(baseString.charAt(i++));
                charIV = base64Chars.indexOf(baseString.charAt(i++));
                out += String.fromCharCode((charI << 2) | ((charII & 0x30) >> 4));
                out += String.fromCharCode(((charII & 0xF) << 4) | ((charIII & 0x3C) >> 2));
                out += String.fromCharCode(((charIII & 0x3) << 6) | charIV);
            }
            charI = base64Chars.indexOf(baseString.charAt(i++));
            charII = base64Chars.indexOf(baseString.charAt(i++));
            out += String.fromCharCode((charI << 2) | ((charII & 0x30) >> 4));

            switch (baseString.indexOf("=")) {
                case length - 1:
                    charIII = base64Chars.indexOf(baseString.charAt(i++));
                    out += String.fromCharCode(((charII & 0xF) << 4) | ((charIII & 0x3C) >> 2));
                    break;
                case -1:
                    charIII = base64Chars.indexOf(baseString.charAt(i++));
                    charIV = base64Chars.indexOf(baseString.charAt(i++));
                    out += String.fromCharCode(((charII & 0xF) << 4) | ((charIII & 0x3C) >> 2));
                    out += String.fromCharCode(((charIII & 0x3) << 6) | charIV);
            }
        } else {
            throw new Error(baseString + " does not base64 encoded string.");
        }
    } else {
        throw new Error(baseString + " does not base64 encoded string.");
    }
    return out;
}
原文地址:https://www.cnblogs.com/itachy/p/7235697.html