zoukankan      html  css  js  c++  java
  • php,js 对字符串按位异或运算加密解密

    异或的符号是^。按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0.

    xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520,于是她就明白了我的企图。
    相同位不同则为1,相同则为0。
    00101
    11100
    (^或者xor)
    ----------------
    11001
    运算结果
    x <- x # y
    y <- x @ y
    x <- x @ y
    执行了第一句后x变成了x # y。那么第二句实质就是y <- x # y @ y,由于#和@互为逆运算,那么此时的y变成了原来的x。第三句中x实际上被赋值为(x # y) @ x,如果#运算具有交换律,那么赋值后x就变成最初的y了。这三句话的结果是,x和y的位置互换了。
    通过这个原理运用PHP可实现简单高效的加密
     
    注意:
    PHP语言的^运算符经常用来做加密的运算,解密也直接用^就行,但是和其他语言通信时,其他语言例如objective-c未必能解的出来PHP的^,尤其是当php使用多个字符串如:'abc'^'def',这样的运算时,其他语言少有这种直接可运算的,更不能解的出来
    计算原理:
    'a'^'b' :
        a和b的ASCII分别为97和98,转换2进制后分别为:1100001,1100010
        然后使用此二位进行异或运算,得到结果:11
        再用把二进制数11转换为字符串
        在windon命令行下计算结果会显示一个乱码
    以下为实现方法:
    <?php
    $k = 'app';
    $v = '321';
    echo '秘钥:'.$k;
    echo '</br>';
    echo '明文:'.$v;
    echo '</br>';
    $key = sha1($k);
    echo 'sha1加密秘钥:'.$key;
    echo '</br>';
    $yihuo = $v ^ $key;
    echo '异或运算:'.$yihuo;
    echo '</br>';
    echo 'base64_encode编码:'.base64_encode($yihuo);
    
    //按位异或运算加密
    function xorencrypt( $str, $key ){
        $slen = strlen( $str );
        $klen = strlen( $key );
        $cipher = '';
        for ($i=0;$i<$slen;$i=$i+$klen) {
            $cipher .= substr( $str, $i, $klen )^$key;
        }
        return $cipher;
    }
    
    
    //接收端实现简单的解密
    function xordecrypt( $str, $key ){
        $slen = strlen( $str );
        $klen = strlen( $key );
        $plain = '';
        for ($i=0;$i<$slen;$i=$i+$klen) {
            $plain .= $key^substr( $str, $i, $klen );
        }
        return $plain;
    }
    
    ?>
    
    <script>
        function encodeUTF8(s) {
            var i, r = [], c, x;
            for (i = 0; i < s.length; i++)
                if ((c = s.charCodeAt(i)) < 0x80) r.push(c);
                else if (c < 0x800) r.push(0xC0 + (c >> 6 & 0x1F), 0x80 + (c & 0x3F));
                else {
                    if ((x = c ^ 0xD800) >> 10 == 0) //对四字节UTF-16转换为Unicode
                        c = (x << 10) + (s.charCodeAt(++i) ^ 0xDC00) + 0x10000,
                            r.push(0xF0 + (c >> 18 & 0x7), 0x80 + (c >> 12 & 0x3F));
                    else r.push(0xE0 + (c >> 12 & 0xF));
                    r.push(0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
                };
            return r;
        }
    
        // 字符串加密成 hex 字符串
        function sha1(s) {
            var data = new Uint8Array(encodeUTF8(s))
            var i, j, t;
            var l = ((data.length + 8) >>> 6 << 4) + 16, s = new Uint8Array(l << 2);
            s.set(new Uint8Array(data.buffer)), s = new Uint32Array(s.buffer);
            for (t = new DataView(s.buffer), i = 0; i < l; i++)s[i] = t.getUint32(i << 2);
            s[data.length >> 2] |= 0x80 << (24 - (data.length & 3) * 8);
            s[l - 1] = data.length << 3;
            var w = [], f = [
                    function () { return m[1] & m[2] | ~m[1] & m[3]; },
                    function () { return m[1] ^ m[2] ^ m[3]; },
                    function () { return m[1] & m[2] | m[1] & m[3] | m[2] & m[3]; },
                    function () { return m[1] ^ m[2] ^ m[3]; }
                ], rol = function (n, c) { return n << c | n >>> (32 - c); },
                k = [1518500249, 1859775393, -1894007588, -899497514],
                m = [1732584193, -271733879, null, null, -1009589776];
            m[2] = ~m[0], m[3] = ~m[1];
            for (i = 0; i < s.length; i += 16) {
                var o = m.slice(0);
                for (j = 0; j < 80; j++)
                    w[j] = j < 16 ? s[i + j] : rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1),
                        t = rol(m[0], 5) + f[j / 20 | 0]() + m[4] + w[j] + k[j / 20 | 0] | 0,
                        m[1] = rol(m[1], 30), m.pop(), m.unshift(t);
                for (j = 0; j < 5; j++)m[j] = m[j] + o[j] | 0;
            };
            t = new DataView(new Uint32Array(m).buffer);
            for (var i = 0; i < 5; i++)m[i] = t.getUint32(i << 2);
    
            var hex = Array.prototype.map.call(new Uint8Array(new Uint32Array(m).buffer), function (e) {
                return (e < 16 ? "0" : "") + e.toString(16);
            }).join("");
            return hex;
        }
    
    </script>
    <script>
        /**
         *
         *  Base64 encode / decode
         *  http://www.webtoolkit.info
         *
         **/
        var Base64 = {
    
            // private property
            _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    
            // public method for encoding
            , encode: function (input)
            {
                var output = "";
                var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
                var i = 0;
    
                input = Base64._utf8_encode(input);
    
                while (i < input.length)
                {
                    chr1 = input.charCodeAt(i++);
                    chr2 = input.charCodeAt(i++);
                    chr3 = input.charCodeAt(i++);
    
                    enc1 = chr1 >> 2;
                    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                    enc4 = chr3 & 63;
    
                    if (isNaN(chr2))
                    {
                        enc3 = enc4 = 64;
                    }
                    else if (isNaN(chr3))
                    {
                        enc4 = 64;
                    }
    
                    output = output +
                        this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
                        this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
                } // Whend
    
                return output;
            } // End Function encode
    
    
            // public method for decoding
            ,decode: function (input)
            {
                var output = "";
                var chr1, chr2, chr3;
                var enc1, enc2, enc3, enc4;
                var i = 0;
    
                input = input.replace(/[^A-Za-z0-9+/=]/g, "");
                while (i < input.length)
                {
                    enc1 = this._keyStr.indexOf(input.charAt(i++));
                    enc2 = this._keyStr.indexOf(input.charAt(i++));
                    enc3 = this._keyStr.indexOf(input.charAt(i++));
                    enc4 = this._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);
                    }
    
                } // Whend
    
                output = Base64._utf8_decode(output);
    
                return output;
            } // End Function decode
    
    
            // private method for UTF-8 encoding
            ,_utf8_encode: function (string)
            {
                var utftext = "";
                string = string.replace(/
    /g, "
    ");
    
                for (var n = 0; n < string.length; n++)
                {
                    var c = string.charCodeAt(n);
    
                    if (c < 128)
                    {
                        utftext += String.fromCharCode(c);
                    }
                    else if ((c > 127) && (c < 2048))
                    {
                        utftext += String.fromCharCode((c >> 6) | 192);
                        utftext += String.fromCharCode((c & 63) | 128);
                    }
                    else
                    {
                        utftext += String.fromCharCode((c >> 12) | 224);
                        utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                        utftext += String.fromCharCode((c & 63) | 128);
                    }
    
                } // Next n
    
                return utftext;
            } // End Function _utf8_encode
    
            // private method for UTF-8 decoding
            ,_utf8_decode: function (utftext)
            {
                var string = "";
                var i = 0;
                var c, c1, c2, c3;
                c = c1 = c2 = 0;
    
                while (i < utftext.length)
                {
                    c = utftext.charCodeAt(i);
    
                    if (c < 128)
                    {
                        string += String.fromCharCode(c);
                        i++;
                    }
                    else if ((c > 191) && (c < 224))
                    {
                        c2 = utftext.charCodeAt(i + 1);
                        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                        i += 2;
                    }
                    else
                    {
                        c2 = utftext.charCodeAt(i + 1);
                        c3 = utftext.charCodeAt(i + 2);
                        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                        i += 3;
                    }
    
                } // Whend
    
                return string;
            } // End Function _utf8_decode
    
        }
    </script>
    
    <script>
        function xor_enc(str, key) {
            var crytxt = '';
            var k, keylen = key.length;
            for(var i=0; i<str.length; i++) {
                k = i % keylen;
                crytxt += String.fromCharCode(str.charCodeAt(i) ^ key.charCodeAt(k));
            }
            return crytxt;
        }
    </script>
    <script>
        var k = 'app';
        var key = sha1('app');
        var v = '321';
        var yihuo = xor_enc(v,key);
    
        console.log('秘钥:'+k);
        console.log('明文:'+v);
        console.log('sha1加密秘钥:'+key);
        console.log('异或运算:'+yihuo);
        console.log('base64_encode编码:'+Base64.encode(yihuo));
    
    </script>

    运行效果图:

     
  • 相关阅读:
    Grails
    Grails
    Grails
    Grails
    Grails
    Grails
    PG
    TopShelf安装多实例
    Js 实现自定义事件
    HttpContext未null处理
  • 原文地址:https://www.cnblogs.com/-mrl/p/10610265.html
Copyright © 2011-2022 走看看