PHP与javascript对称加密

浪尽此生 提交于 2019-12-06 09:37:13

PHP

/**
     * 可逆加密,
     * @author NullEcho
     * @param  string $data 加密数据
     * @param  string $key  加密因子
     */
    public static function encrypt($data, $key)
    {
        if (empty($data)) return $data;
        $key  = md5($key);
        $x    = 0;
        $len  = strlen($data);
        $str = '';
        for ($i = 0; $i < $len; $i++) {
            if ($x == 32) $x = 0;
            $char = $key[$x];
            $str .= chr(ord($data[$i]) ^ ord($char));
            $x++;
        }
        return base64_encode($str);
    }

javascript

import md5 from 'js-md5'

function Decrypt() {
    let _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
        _salt = '', //4124bc0a9335c27f086f24ba207a4912
        _saltIdx = 0,
        _cache = [],
        _xorKey = function(byte) {
            if (_saltIdx == 32) _saltIdx = 0
            byte = byte ^ _salt.charCodeAt(_saltIdx++)
            return _toUtf8(byte)
        },
        // utf-8字符转换
        _toUtf8 = function(byte) {
            if (_cache.length) {
                let _firstByte = _cache[0]
                // 如果缓存字节是10开头
                if (_firstByte > 191 && _firstByte < 224) {
                    _cache = []
                    return String.fromCharCode(((_firstByte & 31) << 6) | (byte & 63))
                }
                // 缓存第一个字节是110开头,当前缓存只有一个字节时追加到缓存返回空
                if (_cache.length === 1) {
                    _cache.push(byte)
                    return ''
                }
                let _secByte = _cache[1]
                _cache = []
                return String.fromCharCode(((_firstByte & 15) << 12) | ((_secByte & 63) << 6) | (byte & 63))
            }
            if (byte < 128) return String.fromCharCode(byte)
            _cache.push(byte)
            return ''
        }

    this.decryptResponse = function(input, key = 'aa') {
        if (input) return false
        _salt = md5(key)
        _saltIdx = 0
        let output = '',
            i = 0
        // eslint-disable-next-line no-useless-escape
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '')
        while (i < input.length) {
            let 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)
            output += _xorKey(chr1)
            if (enc3 != 64) output += _xorKey(((enc2 & 15) << 4) | (enc3 >> 2))
            if (enc4 != 64) output += _xorKey(((enc3 & 3) << 6) | enc4)
        }
        return output
    }
}
export default new Decrypt()

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!