• base64和Xxtea的加密和解密


    base64和Xxtea的加密和解密

    数据加密是web数据安全的一种方式,前几天拿到一个base64+xxtea加密的数据,现在在这里整理一下使用的过程。首先当然是全网站找解密方法,但是最后的结果不是很理想,都不是自己想要的,这里只针对前端js的加密和解密

    看代码:

    ``` function long2str(v, w) { var vl = v.length; var sl = v[vl - 1] & 0xffffffff; for (var i = 0; i < vl; i++) { v[i] = String.fromCharCode(v[i] & 0xff, v[i] >>> 8 & 0xff, v[i] >>> 16 & 0xff, v[i] >>> 24 & 0xff); } if (w) { return v.join('').substring(0, sl); } else { return v.join(''); } }

    function str2long(s, w) { var len = s.length; var v = []; for (var i = 0; i < len; i += 4) { v[i >> 2] = s.charCodeAt(i) | s.charCodeAt(i + 1) << 8 | s.charCodeAt(i + 2) << 16 | s.charCodeAt(i + 3) << 24; } if (w) { v[v.length] = len; } return v; }

    function xxtea_encrypt(str, key) { if (str == "") { return ""; } var v = str2long(str, true); var k = str2long(key, false); var n = v.length - 1;

    var z = v[n], y = v[0], delta = 0x9E3779B9;
    var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = 0;
    while (q-- > 0) {
        sum = sum + delta & 0xffffffff;
        e = sum >>> 2 & 3;
        for (var p = 0; p < n; p++) {
            y = v[p + 1];
            mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
            z = v[p] = v[p] + mx & 0xffffffff;
        }
        y = v[0];
        mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
        z = v[n] = v[n] + mx & 0xffffffff;
    }
    
    return long2str(v, false);
    

    }

    function xxtea_decrypt(str, key) { if (str == "") { return ""; } var v = str2long(str, false); var k = str2long(key, false); var n = v.length - 1;

    var z = v[n - 1], y = v[0], delta = 0x9E3779B9;
    var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = q * delta & 0xffffffff;
    while (sum != 0) {
        e = sum >>> 2 & 3;
        for (var p = n; p > 0; p--) {
            z = v[p - 1];
            mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
            y = v[p] = v[p] - mx & 0xffffffff;
        }
        z = v[n];
        mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
        y = v[0] = v[0] - mx & 0xffffffff;
        sum = sum - delta & 0xffffffff;
    }
    
    return long2str(v, true);
    

    }

    function utf16to8(str) { var out, i, len, c;

    out = [];
    len = str.length;
    for(i = 0; i < len; i++) {
        c = str.charCodeAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            out[i] = str.charAt(i);
        } else if (c > 0x07FF) {
            out[i] = String.fromCharCode(0xE0 | ((c >> 12) & 0x0F),
                                         0x80 | ((c >>  6) & 0x3F),
                                         0x80 | ((c >>  0) & 0x3F));
        } else {
            out[i] = String.fromCharCode(0xC0 | ((c >>  6) & 0x1F),
                                         0x80 | ((c >>  0) & 0x3F));
        }
    }
    return out.join('');
    

    }

    function utf8to16(str) { var out, i, len, c; var char2, char3;

    out = [];
    len = str.length;
    i = 0;
    while(i < len) {
        c = str.charCodeAt(i++);
        switch(c >> 4)
        { 
            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
            // 0xxxxxxx
            out[out.length] = str.charAt(i-1);
            break;
            case 12: case 13:
            // 110x xxxx   10xx xxxx
            char2 = str.charCodeAt(i++);
            out[out.length] = String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
            break;
            case 14:
            // 1110 xxxx  10xx xxxx  10xx xxxx
            char2 = str.charCodeAt(i++);
            char3 = str.charCodeAt(i++);
            out[out.length] = String.fromCharCode(((c & 0x0F) << 12) |
                ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
            break;
        }
    }
    
    return out.join('');
    

    }

    //base64解码 function decode_base64(input) { var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var output = "";
    var chr1, chr2, chr3 = "";
    var enc1, enc2, enc3, enc4 = "";
    var i = 0;

    // remove all characters that are not A-Z, a-z, 0-9, +, /, or =   
    var base64test = /[^A-Za-z0-9+/=
    ]/g;   
    if (base64test.exec(input)) {   
    }   
    input = input.replace(/[^A-Za-z0-9+/=]/g, "");  
    
    do {   
        enc1 = keyStr.indexOf(input.charAt(i++));   
        enc2 = keyStr.indexOf(input.charAt(i++));   
        enc3 = keyStr.indexOf(input.charAt(i++));   
        enc4 = keyStr.indexOf(input.charAt(i++));  
    
        chr1 = (enc1 << 2) | (enc2 >> 4);   
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);   
        chr3 = ((enc3 & 3) << 6) | enc4;  
    
        output = output + String.fromCharCode(chr1);  
    
        if (enc3 != 64) {   
            output = output + String.fromCharCode(chr2);   
        }   
        if (enc4 != 64) {   
            output = output + String.fromCharCode(chr3);   
        }  
    
        chr1 = chr2 = chr3 = "";   
        enc1 = enc2 = enc3 = enc4 = "";  
    
    } while (i < input.length);  
    
    return output;   
    

    }

    <p>然后就是使用:</p>
    
    ```

    xxtea解密函数的key参数,是数据加密的关键字,这个得着后端的程序员给你提供

  • 相关阅读:
    drupal drush 在windows下的安装和配置
    Drupal 7 配置ckeditor和ckfinder编辑器实现图片上传--不用wysisyg
    阿里云Centos配置iptables防火墙
    25个最常用的iptables策略
    防简单攻击iptables策略
    iptables防DDOS攻击和CC攻击设置
    Linux Web服务器网站故障分析常用的命令
    Linux/CentOS防CC攻击脚本
    Map字符串类型去掉空格处理
    读文件字节流大小的动态设置
  • 原文地址:https://www.cnblogs.com/frogblog/p/8607392.html
Copyright © 2020-2023  润新知