常用密码算法
概论
在平时的开发过程中,我们基本上会使用到对称加解密算法,非对称加解密算法以及摘要算法。虽然有很多轮子可供开发者直接调用,但我想,深入了解一下加解密算法常见套路会帮助我们在不同的场景下选择合适的加解密算法。
- 首先对于对称加密算法而言,输入的明文与密钥长度之间是存在相关关系的。多长的密钥长度决定了它能加密多长的明文。那要是超过了密钥长度怎么办?这就涉及到了分组模式的概念。那要是明文不如密钥长度长怎么办?这就涉及到了填充的概念。
- 其次,对于非对称加密算法而言,同样存在对称加密存在的明文过长和过短的问题。但是对于非对称加密算法而言,不涉及分组模式,这就意味着,非对称加密的分组模式并不在标准中定义,需要自己实现。对于明文过短的问题,非对称加密算法也是支持填充的。
填充
正如上文所述,明文与密钥长度之间存在相关性。当明文长度不如密钥长度时,就需要进行填充,即在明文尾部填充一定数量的固定内容使得明文长度与密钥长度一致。 常见的填充算法有:
- PKCS1
- PKCS5:PKCS5是8字节填充的,即填充一定数量的内容,使得成为8的整数倍,而填充的内容取决于需要填充的数目。例如,串
0x56
在经过PKCS5填充之后会成为0x56 0x07 0x07 0x07 0x07 0x07 0x07 0x07
因为需要填充7字节,因此填充的内容就是7。当然特殊情况下,如果已经满足了8的整倍数,按照PKCS5的规则,仍然需要在尾部填充8个字节,并且内容是0x08
,目的是为了加解密时统一处理填充。 - PKCS7:PKCS7与PKCS5的区别在于PKCS5只填充到8字节,而PKCS7可以在1-255之间任意填充。
- Zero:如果数据长度是分组块的倍数,则不填充,否者最后一个分组块填充
0x00
至分组块长度。 - ANSIX923:ANSIX923 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节均填充
0x00
- ISO10126:ISO10126 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据
分组
对称加解密为了能够处理明文长度大于密钥长度的情况,按密钥长度切分明文,并且采取一定的策略对每一个分块进行处理,这种策略就是分组模式。常见的分组模式有ECB和CBC。
- ECB就是将明文切分成与密钥长度一致的分块,对每一个分块进行加解密,不同分块之间互不影响,因此,使用ECB模式下,可以对不同的分块进行并发加解密,性能极佳。
- CBC模式略有不同,不同的分块之间相互影响。首先需要设置初始向量iv与第一个区块一起被加密,加密的结果再作用于第二个区块,再进行加密,以此类推。解密时倒推。
相对来讲,CBC模式更加安全。
非对称加密
所谓非对称加密,即加密密钥和解密密钥并非是同一把密钥。通信的双方分别使用公钥和私钥进行加解密,比如A使用公钥对一段明文进行加密后发送给B,B使用对应的私钥对密文进行解密得到明文。 一般而言,我们会使用非对称加解密算法进行密钥协商或者对长度很小的明文进行加密,这是因为非对称加密的性能相比于对称加密差距巨大。
常见的非对称加密算法有RSA和椭圆曲线,当然不得不提的还有我国提出的国密算法SM2.
RSA加解密算法
RSA加解密算法是依靠的是, 一般只是指模值的位长度,目前主流的有 RSA-1024, RSA-2048,RSA-4096等,数字代表的是密钥长度,密钥长度越长,安全性越高,但相应的性能会下降。
对RSA算法来说,不存在分组模式的概念,对输入的明文长度有所限制,要求输入的明文长度一定小于密钥长度。理论上讲,多长的密钥就加密多长的明文,产生的密文长度与密钥长度一致。但实际上,1024bit的RSA最多加密117字节,也就是936bit的明文,这是因为PKCS1填充规则导致的。
椭圆曲线算法
相比于RSA加解密算法,椭圆曲线一般用在密钥交换上,极少听说使用椭圆曲线进行明文加密,但是经过中国工程师们的设计,SM2算法可以替代RSA算法进行明文加密。
对称加密
故名思义,对称加密就是加密和解密使用同一把密钥。从最原始的凯撒密钥到现如今安全系统极高的AES加密算法。
因为对称加密性能较好,因此它常常被用来加密大量数据,因此,需要对大量数据进行切分,对每一部分按照一定的规则进行加解密,这就是对称加密中的分组模式。常见的对称加解密算法有DES 、3DES(又叫DESede)、AES。
算法名称 | 密钥长bit | 块长bit | 速度 | 说明 |
---|---|---|---|---|
DES | 56 | 64 | 慢 | 不安全, 不要使用 |
3DES | 112/168 | 64 | 很慢 | 中等安全, 适合加密较小的数据 |
AES | 128/192/ 256 | 128 | 快 | 安全 |
DES算法常用实践
目前DES已被证明安全性不足,因此在实际业务场景中,多使用3DES进行替代。3DES就是按照一定的规则使用3次DES加密,一般而言,存在两种使用方式。
双倍长DES,即3DES密钥长度为16字节
这种算法可简述为:
cipher2 Encrypt(plain1, key) {
lkey = key[0-8];
rkey = key[8-16];
1. ENCRYPT(plain1, lkey, cipher1);
2. DECRYPT(cipher1, rkey, plain2);
3. ENCRYPT(plain2, lkey, cipher2);
}
复制代码
伪代码的含义为: 双倍长密钥被细分成为前半部分和后半部分。首先使用前半部分密钥对明文几进行DES加密的到密文cipher1,然后再用后半部分密钥对cipher1进行解密的到plain2,然后再用前半部分密钥对plain2进行DES加密,的到最终的加密结果。
三倍长DES,即3DES密钥长度为24字节
三倍长算法可简述为:
cipher2 Encrypt(plain1, key) {
lkey = key[0-8];
ckey = key[8-16];
rkey = key[16-24];
1. ENCRYPT(plain1, lkey, cipher1);
2. DECRYPT(cipher1, ckey, plain2);
3. ENCRYPT(plain2, rkey, cipher2);
}
复制代码
伪代码的含义为: 整个过程与双倍长算法基本类似,唯一的区别就是在进行第二步的解密时使用的是密钥的中间8字节。
AES算法常用实践
AES相比于DES和3DES,安全系数更高。 常见的AES密钥长度是128bit。
摘要算法
摘要指的是通过一定规则的计算,将输入的串转化成唯一的一串数字,对明文的任何改动都会导致数字串的改变。因此摘要算法主要用于防信息篡改。
目前常用的算法有MD5,SHA-1,SHA-256。SHA-256产生的数字串长度正如其名所示,是256bit的,而SHA-1时160bit,MD5时128bit。
数字串长度越长越安全,事实也是如此,目前MD5和SHA-1已经被破解。因此在生产上,为了保证足够的安全性可以采用SHA-256算法。
国密SM3算法同样提供了非常安全的摘要算法,它产生的串长度为256bit,提供了与SHA-256相似的安全性和计算效率。
算法 | 哈希串长度 | 安全性 |
---|---|---|
MD5 | 128bit | 不足 |
SHA-1 | 190bit | 不足 |
SHA-256 | 256bit | 强 |
SM3 | 256bit | 强 |