加密算法科普:
加密一般分为:对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption)。
常见的对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6 和 AES。 常见的非对称加密算法:RSA、ECC (移动设备用)、Diffie-Hellman、El Gamal、DSA (数字签名用)。
常见的 Hash 算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1
分组加密算法中,有ECB,CBC,CFB,OFB这几种算法模式。
1、什么是对称密码算法
网络安全通信中要用到两类密码算法,加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption)。
对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。
对称密码算法有时又叫传统密码算法、秘密密钥算法或单密钥算法。对称密码算法的加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加密解密密钥是相同的。它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加密解密。只要通信需要保密,密钥就必须保密。对称算法又可分为两类。
一类只对明文中的单个位(有时对字节)运算的算法称为序列算法或序列密码。
另一类算法是对明文的一组位进行运算,这些位组称为分组,相应的算法称为分组算法或分组密码。
现代计算机密码算法的典型分组长度为64位――这个长度既考虑到分析破译密码的难度,又考虑到使用的方便性。后来,随着破译能力的发展,分组长度又提高到128位或更长。 常用的采用对称密码术的加密方案有5个组成部分:
- 明文:原始信息。
- 加密算法:以密钥为参数,对明文进行多种置换和转换的规则和步骤,变换结果为密文。
- 密钥:加密与解密算法的参数,直接影响对明文进行变换的结果。
- 密文:对明文进行变换的结果。
- 解密算法:加密算法的逆变换,以密文为输入、密钥为参数,变换结果为明文。
对称加密优点:
对称加密算法的运行速度比非对称加密算法的速度快很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。
算法选择:
通常情况下,秘钥越长,需要解密的时间就越久,程序运行的速度就越慢,AES建议采用128位,对称性加密中使用最多的是AES加密算法.
缺点:对称加密客户端和服务端使用同一个密匙,存在被抓包破解的风险。
2、什么是非对称加密
非对称密码算法也叫公开密钥密码算法或双密钥算法。
它需要两个密钥,一个称为 公开密钥 (public key),即 公钥,另一个称为 私有密钥 (private key),即 私钥。因为 加密 和 解密 使用的是两个不同的密钥,所以这种算法称为 非对称加密算法。
公开密钥加密(英语:public-key cryptography,又译为公开密钥加密),也称为非对称加密(asymmetric cryptography),一种密码学算法类型,在这种密码学方法中,需要一对密钥(其实这里密钥说法不好,就是“钥”),一个是私人密钥,即 私钥;另一个则是公开密钥,即 公钥。这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。指的是加、解密使用不同的密钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。反之,私钥加密的信息,只有公钥才能解密。俗话来说:“要想使用非对称加密算法,首先要有一对key,一个被称为private key私钥,一个成为public key公钥,然后可以把你的public key分发给想给你传密文的用户,然后用户使用该public key加密过得密文,只有使用你的private key才能解密,也就是说,只要你自己保存好你的private key,就能确保,别人想给你发的密文不被破解,所以你不用担心别人的密钥被盗,没关系。 ”
缺点:
非对称加密的缺点是其加解密速度要远远慢于对称加密,密钥尺寸大,加解密速度慢,一般用来加密少量数据,在某些极端情况下,甚至能比非对称加密慢上1000倍,适用于少量数据加密的情况下。
算法选择:
通常情况下,秘钥越长,需要解密的时间就越久,程序运行的速度就越慢,非对称性加密中使用最多的是RSA加密算法。
使用公钥加密,私钥解密,私钥签名,公钥验签。安全性比对称加密高,但速度较慢。非对称加密使用两个密匙,服务端和客户端密匙不一样,私钥放在服务端,黑客一般是拿不到的,安全性高。
3、对称加密与非对称加密对比
- 在管理方面:
公钥密码算法只需要较少的资源就可以实现目的,在密钥的分配上,两者之间相差一个指数级别(一个是 n 一个是 n2)。所以私钥密码算法不适应广域网的使用,而且更重要的一点是它不支持数字签名;
- 在安全方面:
由于公钥密码算法基于未解决的数学难题,在破解上几乎不可能。对于私钥密码算法,到了 AES 虽说从理论来说是不可能破解的,但从计算机的发展角度来看。公钥更具有优越性;
- 从速度上来看:
AES 的软件实现速度已经达到了每秒数兆或数十兆比特。是公钥的 100 倍,如果用硬件来实现的话这个比值将扩大到 1000 倍。
- 对称加密优缺点:
对称加密相比非对称加密算法来说,加解密的效率要高得多、加密速度快。但是缺陷在于对于密钥的管理和分发上比较困难,不是非常安全,密钥管理负担很重。
- 非对称加密优缺点:
安全性更高,公钥是公开的,密钥是自己保存的,不需要将私钥给别人。缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
4、分组加密(英语:Block cipher)
又称分块加密或块密码,是一种对称密钥算法。它将明文分成多个等长的模块(block),使用确定的算法和对称密钥对每组分别加密解密。
5、散列算法(又称哈希函数(Hash算法))
Hash 算法特别的地方在于它是一种单向加密算法,用户可以通过 Hash 算法对目标信息生成一段特定长度的唯一的 Hash 值,却不能通过这个 Hash 值重新获得目标信息。因此 Hash 算法常用在不可还原的密码存储、信息完整性校验等。
在信息安全技术中,经常需要验证消息的完整性,散列(Hash)函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。这个固定长度的输出称为原输入消息的"散列"或"消息摘要"(Message digest)。散列算法不算加密算法,因为其结果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是签名。
使用场景:
主要用于验证,防止信息被篡改。具体用途如: 文件校验、数字签名、HTTP请求报文验签、鉴权协议、一致性验证、安全访问认证。(a. nacos分布式配置中心原理就是基于MD5对文件签名校验,MD5不一致即配置文件需要被更新了。 b. 微信公众号开发接入开发者通过SHA1散列算法签名实现。)
算法选择:
散列算法中使用最多的是MD5居多,其次是SHA1也不少。
单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:
MD5 (Message Digest Algorithm 5):是 RSA 数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文;
SHA (Secure Hash Algorithm):可以对任意长度的数据运算生成一个 160 位的数值。 SHA-1 与 MD5 的比较 :因为二者均由 MD4 导出,SHA-1 和 MD5 彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:对强行供给的安全性:最显著和最重要的区别是 SHA-1 摘要比 MD5 摘要长 32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对 MD5 是 2128 数量级的操作,而对 SHA-1 则是 2160 数量级的操作。这样,SHA-1 对强行攻击有更大的强度;对密码分析的安全性:由于 MD5 的设计,易受密码分析的攻击,SHA-1 显得不易受这样的攻击;速度:在相同的硬件上,SHA-1 的运行速度比 MD5 慢。
6、分组加密的几种模式(ECB、CBC、CFB、OFB、CTR)
加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption)。
对称加密又分为分组加密和序列密码。
分组密码,也叫块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。
序列密码,也叫流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。解密是指用同样的密钥和密码算法及与加密相同的伪随机位流,用以还原明文位流。
分组加密算法中,有ECB,CBC,CFB,OFB,CTR这几种算法模式。
6.1、ECB(Electronic Code Book:电码本模式)
ECB(电子密本方式)其实非常简单,就是将数据按照8个字节一段(组)进行加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。
特点:
- 简单,有利于并行计算,效率高, 密文有规律, 容易被破解;
- 最后一个明文分组必须要填充;
- 不能隐藏明文的模式;在密文中出现明文消息的重复 ;
- 可能对明文进行主动攻击;
- 不需要初始化向量。
加密消息块相互独立成为被攻击的弱点.
des/3des -> 最后一个分组填充满8字节。
aes -> 最后一个分组填充满16字节。
加密:
解密:
6.2、CBC(Cipher Block Chaining:密文分组链接方式)
CBC(密文分组链接方式)有点麻烦,它的实现机制使加密的各段数据之间有了联系。其实现的机理如下:
加密步骤如下:
1)首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,用指定的PADDING数据补位)
2)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)
3)第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2
4)之后的数据以此类推,得到Cn
5)按顺序连为C1C2C3......Cn即为加密结果。
解密步骤如下:
1)首先将数据按照8个字节一组进行分组得到C1C2C3......Cn
2)将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或);
3)将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2;
4)之后依此类推,得到Dn;
5)按顺序连为D1D2D3......Dn即为解密结果。
这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位,一定要把补位去掉才是你的原来的数据。
特点:
- 密文没有规律, 经常使用的加密方式;
- 最后一个明文分组需要填充(8个字节一组);
- 需要一个初始化向量 - 一个数组,数组的长度: 与明文分组相等,数据来源: 负责加密的人的提供的;加解密使用的初始化向量值必须相同。
- 不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
每个密文块依赖于所有的信息块,明文消息中一个改变会影响所有密文块。 - 加密过程是串行的,无法被并行化;在解密时,从两个邻接的密文块中即可得到一个平文块。因此,解密过程可以被并行化。
des/3des -> 最后一个分组填充满8字节
aes -> 最后一个分组填充满16字节
加密:
解密:
6.3、CFB(Cipher Feedback:密文反馈模式)
密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程:
需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与平文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位平文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位平文,再将密文的下面x位移入寄存器。
与CBC相似,平文的改变会影响接下来所有的密文,因此加密过程不能并行化;
而同样的,与CBC类似,解密过程是可以并行化的。
特点:
密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文。
不需要填充;
需要一个初始化向量 :
一个数组,数组的长度: 与明文分组相等,
数据来源: 负责加密的人的提供的;
加解密使用的初始化向量值必须相同;
6.4、OFB(Output Feedback : 输出反馈模式)
输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与平文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使平文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算而在加密后进行校验也可以得出正确结果。
每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于平文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将平文或密文进行并行的异或处理。
可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。
特点:
密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文;
不需要填充。
需要一个初始化向量 :
初始化向量为一个数组,数组的长度: 与明文分组相等;
数据来源: 负责加密的人的提供的;
加解密使用的初始化向量值必须相同。
OFB模式不是通过密码算法对明文直接加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的。
6.5、CTR - CounTeR, 计数器模式(重点,推荐使用)
特点:
密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文;
不需要填充;
不需要初始化向量;
go接口中的iv可以理解为随机数种子, iv的长度 == 明文分组的长度
这里我们有必要给出CTR模式额解密流程,因为CTR模式的解密和加密是一模一样的过程,在程序实现中也是可逆的。
加密:
解密:
6.6、总结
通过对比发现CTR加密即解密,解密即加密,且各分组之间是独立的,可以并发完成,效率高。
以上五种分组模式中,ECB模式很容易被破解,如今已经很少再使用,其余四种分组模式各有千秋。
但极力推荐CBC模式和CTR模式,尤其是CTR模式,不需要填充,代码实现起来很方便。而且加密和解密的方法是一样的,并且可以实现并发分组,效率高,安全性也有保障。