Base64编码

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,本质上是一种将二进制数据转成文本数据的方案,对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次方=64)计算其十进制值,根据该值在A--Z,a--z,0--9,+,/ 这64个字符中找到对应的字符,最终得到一个文本字符串。

严格来讲,Base64只能算是一个编码算法,并不是安全领域的加密算法。

标准Base64编码解码无需额外信息即完全可逆,即使你自己自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。

Base64编码基本规则如下几点

  • 标准Base64只有64个字符:英文大小写(A-Z、a-z)、数字(0-9)、加号(+)、斜杠(/)和用作后缀的等号(=);
  • Base64是把3个字节变成4个可打印字符,所以Base64编码后的字符串一定能被4整除(不算用作后缀的等号)
  • 等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,Base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个0就加上几个等号。显然添加等号的数目只能是0、1或2;
  • 拓展:位、字节、英文字符、汉字、标点符号之间的关系

    1 bit = 1  二进制数据
    1 byte = 8 bit
    1 字母 = 1 byte = 8 bit
    1 汉字 = 2 byte = 16 bit

    标点符号:

    A>.  汉字输入状态下,默认为全角输入方式,标点符号占2字节;
    B>. 英文输入状态下,默认为半角输入方式,标点符号占1字节;

    Base64编码原理

  • 转换原理
  • 转换前 	10101101,10111010,01110110
    转换后 00101011, 00011011 ,00101001 ,00110110
    十进制 43 27 41 54
    对应Base64编码表中的值 r b p 2

    如上,转换前,Base64收到一个8位字节的序列,首先将这个序列分割成6位的字节序列,然后在每一位的高位补两个0,组成8位的字节序列,也就是转换后的字节长度增加了13;再讲补0后的二进制转换成Base64编码表中对应的值;

  • 填充0原理
  • base64编码收到一个8位字节序列,将这个二进制序列流划分成6位的块。二进制序列有时不能正好平均地分为6位的块,在这种情况下,就在序列末尾填充零位,使二进制序列的长度成为24的倍数(6和8的最小公倍数)。

    对已填充的二进制进行编码时,任何完全填充(不包括原始数组中的位)的6位组都有特殊的第65个符号"="表示。如果6位组是部分填充的,就将填充位设置为0.

    借用张亚涛的一个例子说明:

    a:a -- 011000 010011 101001 100001 -- YTph
    a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==
    a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=
    a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh

    如上,初始输入字符串为"a:a"为3个字节(24位)。24是6和8的倍数,因此按照上面给出的例子计算。无需填充就会得到base64编码为"YTph"。
    然而,再增加一个字符,输入字符串变为"a:aa",转换为二进制就会有32位长。而6和8的下一个公倍数为48.因此要添加16为的填充码。填充的前4位是与数据位混合在一起的。得到的6位组01xxxx,会被当作010000、十进制中的16,或者base64编码的Q来处理。剩下的两个6位组都是填充码,用=来表示。

    Base64参数说明

    DEFAULT:使用默认的方法来加密
    NO_PADDING:略去加密字符串最后的“=”
    NO_WRAP:略去所有的换行符(设置后CRLF就没用了)
    CRLF:使用CR LF这一对作为一行的结尾而不是Unix风格的LF
    URL_SAFE:加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体以-和_取代+和/

    Base64解码

    Base64编码表

    索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符
    0 A 17 R 34 i 51 Z
    1 B 18 S 35 j 52 0
    2 C 19 T 36 k 53 1
    3 D 20 U 37 l 54 2
    4 E 21 V 38 m 55 3
    5 F 22 W 39 n 56 4
    6 G 23 X 40 o 57 5
    7 H 24 41 p 58 6
    8 I 25 Z 42 q 59 7
    9 J 26 a 43 r 60 8
    10 K 27 b 44 s 61 9
    11 L 28 c 45 t 62 +
    12 M 29 d 46 u 63 /
    13 N 30 e 47 v
    14 O 31 f 48 w
    15 P 32 g 49 x
    16 Q 33 h 50 y

    * 参阅资料
    * [百度百科](https://baike.baidu.com/item/base64/8545775?fr=aladdin)
    * [https://segmentfault.com/a/1190000004533485?_ea=657625](https://segmentfault.com/a/1190000004533485?_ea=657625)

    Message-Digest Algorithm 5:(简称MD5)——信息-摘要算法

    传送至加密算法代码位置

    MD2、MD4、MD5区别

    MD2

    MD2算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。如果忽略了检验和将产生MD2冲突。MD2算法的加密后结果是唯一的,即没有重复。

    MD4

    MD4算法同样需要填补信息以确保信息的字节长度加上64后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位Damg?rd/Merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。

    MD5

    MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

    MD5原理

    MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

    MD5的特性

    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

    MD5应用场景

    md5算法主要运用在数字签名、文件完整性验证以及口令加密(安全访问认证)等方面。

    RSA加密


    RSA基本含义

    RSA加密算法是一种非对称加密算法。是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

    先生成一对RSA密钥,保密密钥用户保存,公开密钥可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

    RSA原理

    RSA涉及三个参数:N,e1,e2

    1.随机选择两个大质数p和q,p不等于q,计算N=pq;N的二进制表示时所占用的位数,就是所谓的密钥长度;
    2.根据欧拉函数,求得r=(p-1)*(q-1);
    3.选择小于r的e1,e1可以任意取,但要求e1与r互质;
    4.选择e2,e2为e1关于r的模反元素,即:(e1*e2)=1(mod r);
    4.销毁p,q;

    (n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。

    RSA加解密的算法完全相同,设A为明文,B为密文,则:A≡B^e2( mod n);B≡A^e1 (mod n);(公钥加密体制中,一般用公钥加密,私钥密)

    e1和e2可以互换使用,即:A≡B^e1 (mod n);B≡A^e2( mod n);

    RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

    其他说明

    * 典型密钥长度:1997年后开发的系统,用户应使用1024位密钥,证书认证机构应用2048位或以上;

    Secure Hash Algorithm(简称SHA)——安全散列算法


    加密代码传送

    * [SHA-1 Hash/Hmac加密]()

    SHA基本含义

    SHA主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。
    SHA家族的演算法,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3,其分别是:
    • SHA-0:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA-1的前身。

    • SHA-1:1995年发布,SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性在2000年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1。

    • SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。虽然至今尚未出现对SHA-2有效的攻击,它的演算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑演算法。

    • SHA-3:2015年正式发布,SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前演算法不同的,可替换的加密杂凑演算法,也就是现在的SHA-3。

      其中规定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过264二进制位的消息。SHA-384和SHA-512适用于长度不超过2128二进制位的消息。

    SHA-1

    SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”,所以对散列值的数字签名就可以视为对此明文的数字签名。

    SHA-1原理

    SHA-1是一种能够根据上限为2^64位的消息计算出160比特的散列值的单向散列函数,它的分组及对数据的填充方式与MD5是一样的,512位为1组,填充数据时先填1,后面填0,一直填满448位,最后64位表示原始数据长度。

    SHA-224

    暂时知道SHA-224不支持Android4.2.2版本

    持续更新中, 了解更多——GitHub传送门

    Android中加解密算法大全的更多相关文章

    1. AES加解密算法在Android中的应用及Android4.2以上版本调用问题

       from://http://blog.csdn.net/xinzheng_wang/article/details/9159969 AES加解密算法在Android中的应用及Android4.2以上 ...

    2. 讲讲网络模块中加解密那点儿事--AES+BASE64

      本篇文章已授权微信公众号 dasuAndroidTv(大苏)独家发布 这次想来讲讲网络安全通信这一块,也就是网络层封装的那一套加密.解密,编码.解码的规则,不会很深入,但会大概将这一整块的讲一讲. 之 ...

    3. DES加解密算法Qt实现

        算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为b ...

    4. AES加解密算法Qt实现

      [声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...

    5. C#加解密算法

      先附上源码 加密解密算法目前已经应用到我们生活中的各个方面 加密用于达到以下目的: 保密性:帮助保护用户的标识或数据不被读取. 数据完整性:帮助保护数据不被更改. 身份验证:确保数据发自特定的一方. ...

    6. [转]RSA,DSA等加解密算法介绍

      From : http://blog.sina.com.cn/s/blog_a9303fd90101cgw4.html 1)      MD5/SHA MessageDigest是一个数据的数字指纹. ...

    7. JavaScript与C#互通的DES加解密算法

      原文地址:传送门 本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DE ...

    8. Android中加载位图的方法

      Android中加载位图的关键的代码: AssetManager assets =context.getAssets(); //用一个AssetManager 对象来从应用程序包的已编译资源中为工程加 ...

    9. 3des加解密算法

      编号:1003时间:2016年4月1日09:51:11功能:openssl_3des加解密算法http://blog.csdn.net/alonesword/article/details/17385 ...

    随机推荐

    1. 虚拟DOM与DOM diff算法

      虚拟DOM是什么? 一个虚拟DOM(元素)是一个一般的js对象, 准确的说是一个对象树(倒立的) 虚拟DOM保存了真实DOM的层次关系和一些基本属性,与真实DOM一一对应,如果只是更新虚拟DOM, 页 ...

    2. Graphviz安装及简单使用

      Graphviz Windows环境安装: 1.官网下载 官网下载地址 2.配置环境变量 将graphviz安装目录下的bin文件夹添加到Path环境变量中: 3.验证是否安装并配置成功 进入wind ...

    3. Difference Between InnoDb and MyISAM(个人觉着是好文章,简单易懂,推荐看)

      原文地址:http://acmeextension.com/difference-between-innodb-and-myisam/ MyISAM and InnoDB are the most c ...

    4. E - Matrix Power Series (矩阵数列)

      然后,怎么来求这个前k项的和,我把式子推一下 当k为奇数的时候直接SK-1+AK  就又化为偶数的情况了.代码如下: #include<iostream> #include<cstr ...

    5. Sysbench-OLTP数据库测试

      使用sysbench进行oltp测试之前,需要核对一下sysbench的版本,因为不同版本在使用的参数时,会有一定的差异. mysql dba这本书中的sysbench使用的是0.5的版本,ubunt ...

    6. Centos 7 KVM安装win10

      KVM架构: KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案.KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 L ...

    7. 【Codeforces 464D】World of Darkraft - 2

      Codeforces 464 D 首先我们知道这K个装备是互不干扰的,就是说如果一个装备升级了或者卖掉了,不会对其它装备的挣到的钱产生任何影响.所以我们就考虑单独处理某一个装备挣到的钱. 那么就设\( ...

    8. linux下的C语言程序设计

      Linux程序设计基础知识 Linux下C语言编程环境概述 Linux下C语言编程常用的编辑器是vim或emacs,编译器一般用gcc,编译链接程序用make,跟踪调试一般使用gdb,项目管理用mak ...

    9. ESP8266开发综合篇(LUA开发-视频教程总揽)

      为了解决基础教程简单入门但不实用,项目方案非常实用但比较难的问题,开始推出8266开发综合篇 综合篇涉及到AT,LUA,SDK,LUA(sdk)开发,LUA和SDK开发会同步进行,后期再整理AT指令的 ...

    10. 一、java三大特性--封装

      封装字面意思即包装.专业点来说就是数据隐藏,是指利用抽象数据将数据和基于数据的操作封装起来,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能的隐藏细节,只保留一些对外的接口和外部 ...