zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Overloaded的方法是否可以改变返回值的类型
    parseXXX的用法
    java的类型转换问题。int a = 123456;short b = (short)a;System.out.println(b);为什么结果是-7616?
    UVA 10405 Longest Common Subsequence(简单DP)
    POJ 1001 Exponentiation(大数处理)
    POJ 2318 TOYS(计算几何)(二分)
    POJ 1265 Area (计算几何)(Pick定理)
    POJ 3371 Flesch Reading Ease (模拟题)
    POJ 3687 Labeling Balls(拓扑序列)
    POJ 1094 Sorting It All Out(拓扑序列)
  • 原文地址:https://www.cnblogs.com/itachy/p/7235697.html
Copyright © 2011-2022 走看看