Android中加解密算法大全

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传送门

    上一篇:关于有默认值的字段在用EF做插入操作时的思考


    下一篇:技术博客——微信小程序UI的设计与美化