encrypt-note

对称加密算法

指加密和解密使用相同密钥的加密算法。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密。

  1. 算法公开、计算量小、加密速度快、加密效率高

  2. 密钥相同,安全性不足

  3. 每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙。有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 为其工作模式。

模式:

  1. ECB模式

  2. CBC模式

  3. OFB模式

  4. CTR模式

AES

高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准 Rijndael加密法。

AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特。

AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。

各轮AES加密循环(除最后一轮外)均包含4个步骤

(1) AddRoundKey轮密钥加-矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生

AES-AddRoundKey

(2) SubBytes字节替代-通过一个非线性的替换函数,通过S盒完成一个字节到另外一个字节的映射

AES-SubBytes

矩阵中的各字节通过一个8位的S-box(Substitution-box,置换盒)查找表进行转换,bij = S(aij)

(3) ShiftRows行移位-将矩阵中的每个横列进行循环式移位

AES-ShiftRows

矩阵的行操作,矩阵中每一行的各个字节循环向左方位移。位移量则随着行数递增而递增。

(4) MixColumns列混淆-为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey替换。

AES-MixColumns

每一列的四个字节通过线性变换互相结合。每一列的四个元素分别当作1 , x , x^2 , x^3的系数,合并即为GF(2^8)中的一个多项式。接着将此多项式和一个固定的多项式c(x)=3x^3+x^2+x+2在modulo x^4+1下相乘。

aes.c

非对称加密算法

指加密密钥与解钥密钥不同,密钥分公钥和私钥的加密算法,也称为公私钥加密。

  1. 算法强度复杂、安全性依赖于算法与密钥

  2. 加解密速度要远远慢于对称加密

常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用) 。

RSA

RSA是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。

对极大整数做因数分解的难度决定了RSA算法的可靠性。

RSA 算法的安全性是建立在乘法不可逆或者大数因子很难分解的基础上。

RSA算法原理(一)

  1. 互质关系

  2. 欧拉函数

  3. 欧拉定理,欧拉定理是RSA算法的核心

  4. 模反元素

RSA算法原理(二)

密钥生成的步骤

  1. 随机选择两个不相等的质数p和q

  2. 计算p和q的乘积n,n = 61×53 = 3233(110010100001),密钥就是12位

  3. 计算n的欧拉函数φ(n)φ(n) = (p-1)(q-1),φ(3233)等于60×52,即3120

  4. 随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质,随机选择了17

  5. 计算e对于φ(n)的模反元素d,ed ≡ 1 (mod φ(n)),17x + 3120y = 1

  6. 将n和e封装成公钥,n和d封装成私钥

  7. 加密和解密,加密要用公钥 (n,e),解密要用私钥(n,d)

Hash算法

单向,不可逆算法,通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,但不能通过这个Hash值重新获得目标信息。常用在不可还原的密码、信息完整性校验等。

  1. 长度不受限制

  2. Hash值容易计算

  3. 散列函数运算过程不可逆

常见的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个字节再根据不同的数据形式把字节数组重新整理成数据。

参考

AES-高级加密标准

RSA in JavaScript

RSA加密算法-wiki

RSA算法原理(一)

RSA算法原理(二)

Base64-wiki

Web API的接口访问分类

算法4