Base64编码
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,本质上是一种将二进制数据转成文本数据的方案,对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次方=64)计算其十进制值,根据该值在A--Z,a--z,0--9,+,/ 这64个字符中找到对应的字符,最终得到一个文本字符串。
严格来讲,Base64只能算是一个编码算法,并不是安全领域的加密算法。
标准Base64编码解码无需额外信息即完全可逆,即使你自己自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。
Base64编码基本规则如下几点
拓展:位、字节、英文字符、汉字、标点符号之间的关系
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编码表中对应的值;
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算法主要运用在数字签名、文件完整性验证以及口令加密(安全访问认证)等方面。
- 参考:http://blog.csdn.net/shb2058/article/details/53467501
- 百度百科:https://baike.baidu.com/item/MD5加密/5706230?fr=aladdin
- http://www.cnblogs.com/AndroidJotting/p/4284337.html
- http://www.cnblogs.com/whyhappy/p/5337044.html
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版本