对称加密算法
指加密和解密使用相同密钥的加密算法。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密。
-
算法公开、计算量小、加密速度快、加密效率高
-
密钥相同,安全性不足
-
每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙。有n个用户,共需要n×(n-1) 个密钥,密钥管理困难。
常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES。
DES
数据加密标准(Data Encryption Standard),DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。
入口参数有三个:key、data、mode。key 为加密解密使用的密钥,data 为加密 解密的数据,mode 为其工作模式。
模式:
-
ECB模式
-
CBC模式
-
OFB模式
-
CTR模式
AES
高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准 Rijndael加密法。
AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特。
AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。
各轮AES加密循环(除最后一轮外)均包含4个步骤
(1) AddRoundKey轮密钥加-矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生
(2) SubBytes字节替代-通过一个非线性的替换函数,通过S盒完成一个字节到另外一个字节的映射
矩阵中的各字节通过一个8位的S-box(Substitution-box,置换盒)查找表进行转换,bij = S(aij)
(3) ShiftRows行移位-将矩阵中的每个横列进行循环式移位
矩阵的行操作,矩阵中每一行的各个字节循环向左方位移。位移量则随着行数递增而递增。
(4) MixColumns列混淆-为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey替换。
每一列的四个字节通过线性变换互相结合。每一列的四个元素分别当作1 , x , x^2 , x^3的系数,合并即为GF(2^8)中的一个多项式。接着将此多项式和一个固定的多项式c(x)=3x^3+x^2+x+2在modulo x^4+1下相乘。
非对称加密算法
指加密密钥与解钥密钥不同,密钥分公钥和私钥的加密算法,也称为公私钥加密。
-
算法强度复杂、安全性依赖于算法与密钥
-
加解密速度要远远慢于对称加密
常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用) 。
RSA
RSA是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。
对极大整数做因数分解的难度决定了RSA算法的可靠性。
RSA 算法的安全性是建立在乘法不可逆或者大数因子很难分解的基础上。
-
互质关系
-
欧拉函数
-
欧拉定理,欧拉定理是RSA算法的核心
-
模反元素
密钥生成的步骤
-
随机选择两个不相等的质数p和q
-
计算p和q的乘积n,n = 61×53 = 3233(110010100001),密钥就是12位
-
计算n的欧拉函数
φ(n)
,φ(n) = (p-1)(q-1)
,φ(3233)等于60×52,即3120 -
随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质,随机选择了17
-
计算e对于φ(n)的模反元素d,ed ≡ 1 (mod φ(n)),17x + 3120y = 1
-
将n和e封装成公钥,n和d封装成私钥
-
加密和解密,加密要用公钥 (n,e),解密要用私钥(n,d)
Hash算法
单向,不可逆算法,通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,但不能通过这个Hash值重新获得目标信息。常用在不可还原的密码、信息完整性校验等。
-
长度不受限制
-
Hash值容易计算
-
散列函数运算过程不可逆
常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA 、CRC。
MD5
Message-DigestAlgorithm 5,Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成特定长度的唯一Hash值,常用于文件校验。
简单的MD5加密通过碰撞法已经可以破解。
CRC
循环冗余校验(Cyclic Redundancy Check)
SHA
安全散列算法(Secure Hash Algorithm)
常用编码
base64
一种编码算法,而非加密算法。Base64是一种基于64个基本的ASCII码字符来表示二进制数据的表示方法。Base64编码设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。Base64加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。
以3个字节为一组。按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个=。
对ABC进行BASE64编码首先取ABC对应的ASCII码值。A(65)B(66)C(67)。再取二进制值A(01000001)B(01000010)C(01000011),然后把这三个字节的二进制码接起来(010000010100001001000011),再以6位为单位分成4个数据块并在最高位填充两个0后形成4个字节的编码后的值(00010000)(00010100)(00001001)(00000011)。蓝色部分为真实数据。再把这四个字节数据转化成10进制数得(16)(20)(19)(3)。最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D)。
解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。