Js加密算法_Base64

访客4年前关于黑客接单470

一. 简介

首先有个小Tips,1个字母字符 = 1个字节(byte) = 8位(bit),这是示意单米,Base64是 *** 上最常见的用于传输 8bit 的编码方式之一,Base64就是一种基于64个可打印字符来示意二进制数据的方式。

在一些 *** 传送渠道,有时候有些的字节字符不能被支持.好比图片的二进制流的每个字节不能能全部是可见字符,这种情况下传送不了.而Base64的机制就能很好解决这种问题,它不改变原来的协议,在原来的基础做一种扩展,基于64个可打印字符来示意二进制.

再者,有时候我们通过记事本去打开一些图片或者应用程序,会获得一大堆看不懂的乱码,由于二进制文件内里有许多无法显示和打印的字符.以是若是要让记事本能够处置二进制数据,就可以使用Base64来举行转码,将不能见的转成可见的.


二. 算法原理

  1. 我们拿到一串字符,好比 abcdef.先按ASCII码编码.
  2. 它会将字符串按字节数离开,每三个字节为一组. 3 byte * 8 bit === 24bit.
  3. 在这组中,将24位数据根据每6位为一组,再次分成4组.
  4. 然后将这四组的6位数的高位各补两个0,将其转为十进制数.
  5. 举行查表,获得对应的字符,就是对应的Base64转化的字符.


那么有个问题来了,若是原始数据的位数不是3的整数倍怎么办,Base会在不足的后面用"="补足,以是这个"="只会存在在Base64码的最后,而且只会有1或者2个,不能能出现在中心.

// javaScript实现

if (!Shotgun)
    var Shotgun = {};
if (!Shotgun.Js)
    Shotgun.Js = {};
Shotgun.Js.Base64 = {
    _table: [
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
        'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
        'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
    ],
  
    encode: function (bin) {
        var codes = [];
        var un = 0;
        un = bin.length % 3;
        if (un == 1)
            bin.push(0, 0);
        else if (un == 2)
            bin.push(0);
        for (var i = 2; i < bin.length; i += 3) {
            var c = bin[i - 2] << 16;
            c |= bin[i - 1] << 8;
            c |= bin[i];
            codes.push(this._table[c >> 18 & 0x3f]);
            codes.push(this._table[c >> 12 & 0x3f]);
            codes.push(this._table[c >> 6 & 0x3f]);
            codes.push(this._table[c & 0x3f]);
        }
        if (un >= 1) {
            codes[codes.length - 1] = "=";
            bin.pop();
        }
        if (un == 1) {
            codes[codes.length - 2] = "=";
            bin.pop();
        }
        return codes.join("");
    },
    decode: function (base64Str) {
        var i = 0;
        var bin = [];
        var x = 0, code = 0, eq = 0;
        while (i < base64Str.length) {
            var c = base64Str.charAt(i++);
            var idx = this._table.indexOf(c);
            if (idx == -1) {
                switch (c) {
                    case '=': idx = 0; eq++; break;
                    case ' ':
                    case '\n':
                    case "\r":
                    case '\t':
                        continue;
                    default:
                        throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u65E0\u6548\u7F16\u7801\uFF1A" + c };
                }
            }
            if (eq > 0 && idx != 0)
                throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u683C\u5F0F\u9519\u8BEF\uFF01" };
  
            code = code << 6 | idx;
            if (++x != 4)
                continue;
            bin.push(code >> 16);
            bin.push(code >> 8 & 0xff);
            bin.push(code & 0xff)
            code = x = 0;
        }
        if (code != 0)
            throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u6570\u636E\u957F\u5EA6\u9519\u8BEF" };
        if (eq == 1)
            bin.pop();
        else if (eq == 2) {
            bin.pop();
            bin.pop();
        } else if (eq > 2)
            throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u683C\u5F0F\u9519\u8BEF\uFF01" };
  
        return bin;
    }
};


三. 应用

  • Base64编码可用于在HTTP环境下通报较长的标识信息.
  • 电子邮件:有些文本协议不支持不能见字符的通报,只能用大于32的可见字符来通报信息
  • Base64 也会经常用作一个简朴的“加密”来珍爱某些数据,而真正的加密通常都比较繁琐.
  • 垃圾讯息传播者用Base64来避过反垃圾邮件工具,由于那些工具通常都不会翻译Base64的讯息.
  • 前端在实现页面一些比较小的图片,通常会选择将图片内容直接内嵌在页面中,制止不必要的外部资源加载,增大页面加载时间,然则图片数据是二进制数据,该怎么嵌入呢?绝大多数现代浏览器都支持一种名为 Data URLs 的特征,允许使用Base64对图片或其他文件的二进制数据举行编码,将其作为文本字符串嵌入网页中。好比webpack工具中的url-loader默认将8kb以下的图片编译成Base64码嵌在引用文件中.


四. 前端应用

crypto-js:功能强大,不止处置Base64,支持的模块异常多,star数现在6k+,前后端可用

//后端 npm包治理
npm install crypto-js

import sha256 from 'crypto-js/sha256';
import hmacSHA512 from 'crypto-js/hmac-sha512';
import Base64 from 'crypto-js/enc-base64';

const message, nonce, path, privateKey; // ...
const hashDigest = sha256(nonce + message);
const hmacDigest = Base64.stringify(hmacSHA512(path + hashDigest, privateKey));

//前端 Brower治理
bower install crypto-js

js-Base64:专门处置Base64,现在star数2k+,前后端均可用

//安装
$ npm install --save js-base64
//若是你使用的es6语法,需要转载这个举行语法转换
$ npm install --save babel-preset-env

//node.js
var Base64 = require('js-base64').Base64;
//es6+
import { Base64 } from 'js-base64';

//异常轻快的使用体验
Base64.encode('dankogai');  // ZGFua29nYWk=
Base64.encode('小飼弾');    // 5bCP6aO85by+
Base64.encodeURI('小飼弾'); // 5bCP6aO85by


五. 解密

若是你看懂了以上的算法原理,那么解密实在不是太大的问题,只要你遵照这个规则举行逆推运算,就可以获得原始数据.以是严酷上说Base64并不是什么加密,只是编译事后的并不是明文而已


思源资源网:分类流动

1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入

相关文章

全球有几个黑客大赛(全世界黑客大赛)

全球有几个黑客大赛(全世界黑客大赛)

有什么有名气的黑客大赛大家知道的啊? 最著名的黑客大赛应该就是刚刚结束的Pwn2Own了哦。说它最著名,因为它的参赛团队实力强劲,比赛项目技术含量高难度大,当然比赛奖金也是十分丰厚的,本届Pwn2Ow...

一女子为过户京牌结离婚28次-女子3年结离婚28次

对于二三线城市的人来说,拥有一块北京车牌是非常困难的事情,但是其中也不乏有人用违法的手段来获得,近日一女子3年结离婚28次以骗取京牌指标,据悉这种行为已经严重涉及犯罪了,北京市公安局也呼吁大家且莫打婚...

微信黑客的联系方式-找黑客靠谱吗(黑客怎么找别人的信息)

微信黑客的联系方式-找黑客靠谱吗(黑客怎么找别人的信息)

微信黑客的联系方式相关问题 找黑客靠谱吗相关问题 我的世界黑客为什么要带面具 知道手机号查微博昵称(手机如何更改微博昵称)...

谷歌中国音乐在华最后一天 google.cn域名走远

易名中国(eName.cn)10月19日讯,据了解,Google宣布关掉在我国的音乐搜索服务项目,代表着谷歌中国音乐搜索告一段落在华的四年经营史。   现阶段访问谷歌歌曲,发觉谷歌音乐站内搜索早...

丈夫出轨怎样调研手机微信(抓丈夫出轨非常简单的方法)

丈夫出轨怎样调研手机微信(抓丈夫出轨非常简单的方法)

在夫妻关系中,女性最担忧的便是男人出轨。因而,她们会想起去查验她的丈夫有多种多样方法。一些很俗套,很好用的方式,例如在手机的人查询通讯记录,如规定男人也回家了休息时间。可是,如今这种方式早已出轨男人取...

网赌输了能不能找黑客(网赌输了)

网络赌博本身就是违法。你输了的钱肯定是追不回来的。因为已经被对方转出去了。即使报警也没有用,本身你也是违法。最好还是悬崖勒马,回头是岸。 《中华人民共和国治安管理处罚法》第七十条规定,以营利为目的,为...