Base64是网络上最多见的用于传输8Bit字节代码的编码方式之一,本质上是一种将二进制数据转成文本数据的方案,对于非二进制数据,是先将其转换成二进制形式,而后每连续6比特(2的6次方=64)计算其十进制值,根据该值在A--Z,a--z,0--9,+,/ 这64个字符中找到对应的字符,最终获得一个文本字符串。html
严格来说,Base64只能算是一个编码算法,并非安全领域的加密算法。 标准Base64编码解码无需额外信息即彻底可逆,即便你本身自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。
标准Base64只有64个字符:英文大小写(A-Z、a-z)、数字(0-9)、加号(+)、斜杠(/)和用做后缀的等号(=);
java
1 bit = 1 二进制数据 1 byte = 8 bit 1 字母 = 1 byte = 8 bit 1 汉字 = 2 byte = 16 bit
标点符号:android
A>. 汉字输入状态下,默认为全角输入方式,标点符号占2字节; B>. 英文输入状态下,默认为半角输入方式,标点符号占1字节;
转换前 10101101,10111010,01110110 转换后 00101011, 00011011 ,00101001 ,00110110 十进制 43 27 41 54 对应Base64编码表中的值 r b p 2
如上,转换前,Base64收到一个8位字节的序列,首先将这个序列分割成6位的字节序列,而后在每一位的高位补两个0,组成8位的字节序列,也就是转换后的字节长度增长了13;再讲补0后的二进制转换成Base64编码表中对应的值;git
base64编码收到一个8位字节序列,将这个二进制序列流划分红6位的块。二进制序列有时不能正好平均地分为6位的块,在这种状况下,就在序列末尾填充零位,使二进制序列的长度成为24的倍数(6和8的最小公倍数)。github
对已填充的二进制进行编码时,任何彻底填充(不包括原始数组中的位)的6位组都有特殊的第65个符号"="表示。若是6位组是部分填充的,就将填充位设置为0.算法
借用张亚涛 的一个例子说明:segmentfault
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位组都是填充码,用=来表示。数组
DEFAULT:使用默认的方法来加密 NO_PADDING:略去加密字符串最后的“=” NO_WRAP:略去全部的换行符(设置后CRLF就没用了) CRLF:使用CR LF这一对做为一行的结尾而不是Unix风格的LF URL_SAFE:加密时不使用对URL和文件名有特殊意义的字符来做为加密字符,具体以-和_取代+和/
索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 |
---|---|---|---|---|---|---|---|
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 |
MD2算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。而后,以一个16位的检验和追加到信息末尾。而且根据这个新产生的信息计算出散列值。若是忽略了检验和将产生MD2冲突。MD2算法的加密后结果是惟一的,即没有重复。安全
MD4算法一样须要填补信息以确保信息的字节长度加上64后能被512整除(信息字节长度mod 512 = 448)。而后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位Damg?rd/Merkle迭代结构的区块,并且每一个区块要经过三个不一样步骤的处理。服务器
MD5为计算机安全领域普遍使用的一种散列函数,用以提供消息的完整性保护。
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,通过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
一、压缩性:任意长度的数据,算出的MD5值长度都是固定的。 二、容易计算:从原数据计算出MD5值很容易。 三、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所获得的MD5值都有很大区别。 四、强抗碰撞:已知原数据和其MD5值,想找到一个具备相同MD5值的数据(即伪造数据)是很是困难的。
md5算法主要运用在数字签名、文件完整性验证以及口令加密(安全访问认证)等方面。
RSA加密算法是一种非对称加密算法。是第一个能同时用于加密和数字签名的算法,也易于理解和操做。
先生成一对RSA密钥,保密密钥用户保存,公开密钥可对外公开,甚至可在网络服务器中注册。为提升保密强度,RSA密钥至少为500位长,通常推荐使用1024位。这就使加密的计算量很大。为减小计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,而后使用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算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,可是想要对其乘积进行因式分解却极其困难,所以能够将乘积公开做为加密密钥。
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适用于长度不超过2^64二进制位的消息。SHA-384和SHA-512适用于长度不超过2^128二进制位的消息。
SHA-1是一种数据加密算法,该算法的思想是接收一段明文,而后以一种不可逆的方式将它转换成一段(一般更小)密文,也能够简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值能够说是对明文的一种“指纹”或是“摘要”,因此对散列值的数字签名就能够视为对此明文的数字签名。
SHA-1是一种可以根据上限为2^64位的消息计算出160比特的散列值的单向散列函数,它的分组及对数据的填充方式与MD5是同样的,512位为1组,填充数据时先填1,后面填0,一直填满448位,最后64位表示原始数据长度。
SHA-224
暂时知道SHA-224不支持Android4.2.2版本