目录
6.2.1 DES(data encryption stardards)
6.2.2 三DES(triple-data encryption stardards)
6.2.3 AES(本名Rijndael加密,Advanced encryption stardards)
6.3.2 ECB(electronic code book)
6.3.3 CBC(cipher block chaining)
1.为什么要加密
保证数据的安全传输。
2.加密三要素
2.1 数据
加密中涉及到的数据有明文和密文两种,其中
- 明文:原始数据
- 秘文:加密后的数据(一般不具备可阅读性)
2.2 密钥
密钥会根据加密方式的不同而呈现为不同的状态,通常情况下加密方式存在【对称加密】和【非对称加密】两种。简单说来可以这么理解:负责对数据加密和解密的密钥是同一个东西,称为对称加密。而负责加密数据的公钥和负责解密数据的私钥不是同一个东西,称为非对称加密。
- 对称加密:密钥
- 非对称加密:公钥+私钥。
对于非对称加密而言公钥和私钥通常同时生成,但是公钥只负责用来加密数据因此随意公开丢失也无所谓。但是私钥却是负责用来解密数据的关键,因此私钥一般都是独立保存不轻易展示给别人。
2.3 密码算法
密码算法通常包括加密算法和解密算法两类,每一种不同的加密方式的算法也是天差地别。其中加密算法和解密算法通常不一致,但一般情况下都是互逆的。
对称加密过程:
---------------------------
明文本体:666
密钥:999
加密算法:密文 = 明文本体+密钥
###########################
最终生成密文:1665
对称解密过程:
---------------------------
密文:1665
密钥:999
解密算法:明文本体 = 密文-密钥
###########################
最终生成明文本体:666
3.加密方式
4.最早的加密--凯撒密码
凯撒密码是通过将明文中所使用的字母表按照一定的字数平移来进行加密的方法。
凯撒密码中的加密三要素:
- 【明文:小写字母序列 】|【密文:平移生成的大写字母序列】
- 密钥:平移数字n
- 算法:加密+n 解密-n
相对比较原始,不安全
5.密码信息安全常识与威胁
(1)不要使用保密的密码算法
- 密码算法的秘密早晚都会公诸于世
- 开发高强度的密码算法是非常困难的
(2)使用低强度的密码比不进行任何加密更加危险
(3)任何密码总有一天都会被破解,而密码只是信息安全的一部分。
6.对称加密算法
6.1 编解码
- 编码:字符序列 转换为 bit序列
- 解码:big序列 还原为 字符序列
6.2 对称加密算法常见三种方式
6.2.1 DES(data encryption stardards)
- 密钥结构:56bit密钥+8bit错误检查
- 加密方式:对明文bit序列按照64bit为一个单位(一组)进行加密。这个密钥长度有一个专业名词被称为【分组】
- 解密方式:对密文bit序列按照64bit为一个单位(一组)进行解密。
- 加密说明:des一次加密内容长度只能是64bit,所以如果明文过长就需要对des进行反复迭代。迭代的具体方式被称为【模式】。
- 安全性能:已被破解,不安全
- 补充说明:分组密码是指以分组位单位进行处理的密码算法称为【blockcipher分组密码】,des就是分组密码的一种。
6.2.2 三DES(triple-data encryption stardards)
- 密钥结构:(56bit密钥+8错误检查)* 3
- 加密方式:对明文bit序列按照64bit*3位一个单位(一组)进行加密。明文(密钥1加密->密钥2解密->密钥3加密)得到密文
- 解密方式:对密文bit序列按照64bit*3位一个单位(一组)进行解密。密文(密钥3解密->密钥2加密->密钥1解密)得到明文
- 兼容方式:由于当3Des的三个密钥完全相同时与des完全一致,因此可以向下兼容
- 安全性能:面临被破解,暂时安全,但效率较低
- 安全原因:3Des的三个密钥不知道究竟是否一样,哪一个密钥执行哪一个操作并不确定,因此大大增加安全性。
- 额外说明:如果密钥1和密钥3相同,密钥2不同,那么称为DES-EDE2(Encryption-Decryption-Encryption)
- 如果密钥1、密钥2和密钥3豆不同,那么称为DES-EDE3(Encryption-Decryption-Encryption)
6.2.3 AES(本名Rijndael加密,Advanced encryption stardards)
- 密钥结构:以32bit为单位,在128到156之间进行选择(其实就是128、192、256三种)。
- 密钥说明:由于go语言提供的函数接口只提供了16字节,即128bit参数规格,所以我们只能以128位密钥为标准使用。
- 分组说明:AES的分组长度为128bit。
- 加密方式:
一轮加密:
先把128分组bit内容进行逐bit替换,即SubBytes处理
SubBytes处理:以每个字节的值(0~255中的任意值)为索引,
从一张拥有256个值的替换表(s-box)中查找出对应值的处理。
所以SubBytes在替换的时候内部又是以8bit为一组进行的替换
然后对替换后的bit结构进行平移,即shiftRows处理
ShiftRows处理:类似于凯撒密码的平移,但更繁琐一些
然后对整个平移后的bit结构进行列混淆(乱序),即MixColumns处理
MixColumns处理:对一个4字节进行运算使其变成另一个4字节内容的计算处理
所以MixColumns在运算的时候内部是以32bit为一组进行计算
最后对得到的bit结构通过轮密钥进行XOR加密,即AddRoundKey处理:
AddRoundKey:逐位与轮密钥异或操作。
然后重复上述一轮操作10~14次,得到最终加密内容。
- 解密方式:上述步骤反向操作
- 安全性能:极高,以目前设备性能对一条128bitAES加密内容的暴力拆解需要耗时近10亿年
6.3 分组密码模式
前文中提到分组密码是需要按照密钥规律对明文进行分组进行加密的(例如DES),而如何分组就是一个比较需要考虑的问题。因为如果分组模式不恰当会导致加密后的数据规律能够被识别出来,例如EBC下的加密内容就能够被识别出一些规律。当下比较常见的分组密码模式有五种:ECB、CBC、CFB、OFB、CTR
- ECB模式:Electronic Code Book mode(电子密码本模式)
- CBC模式:Cipher Block Chaining mode(密码分组链接模式)
- CFB模式:Cipher FeedBack mode(密文反馈模式)
- OFB模式:Output FeedBack mode(输出反馈模式)
- CTR模式:CounTeR mode(计数器模式)
6.3.1 分组密码结构填充问题
因为加密内容的长度不是总能够被分组长度(一个分组的bit数称为分组长度)恰好整除,例如按照一组8bit来拆分801bit的数据就必然产生一个bit的余数,因此数据在进行加密之前必须存在结构填充操作。一般情况下对于数据中最后一个分组采用 “缺几补几” 的方法进行内容填充,而对于刚好能整除密钥长度的原始数据则补充一整个分组长度的数据。
在分组模式中,ECB和CBC都需要填充长度,而CFB、OFB和CTR则不需要填充长度。
6.3.2 ECB(electronic code book)
- 模式说明:分组加密
- 模式特点:简单、高效率、密文有规律容易被攻破,最后一个明文分组必须结构填充
- 模式补充:des/3des最后一个分组长度填充满至8字节,而aes 最后一个分组填充满至16字节(因为密钥是16字节长度)
- 向量需求:不需要初始化向量
6.3.3 CBC(cipher block chaining)
- 模式说明:用初始化向量和第一个分组异或后加密,然后得到的结果与第二个分组异或后加密,以此类推。
- 模式优势:初始化向量的多样化能够保证当初始化向量不同时,得到的加密结果一定不同。
- 模式解析:解密过程是第一个分组解密后和初始化向量异或,然后第二个分组解密后和第一个分组异或,以此类推。
- 模式特点:效率略低、密文无规律、不容易被破解,推荐使用。最后一个明文分组必须填充
- 模式补充:des/3des 最后一个分组长度填充满至8字节,而aes 最后一个分组填充满至16字节
- 向量需求:需要初始化向量
初始化向量由加密者提供
初始化向量长度 == 分组数据长度
加密与解密使用的是同一个初始化向量
6.3.4 CFB(cipher feedback)
- 模式说明:先对初始化向量加密,然后和第一个分组明文异或的到密文。然后对密文加密后和第二个分组明文异或,以此类推。
- 模式解析:解密过程是第一个分组与初始化向量加密异或,然后第二个分组与(第一个分组的加密)异或,以此类推
- 模式特点:密文无规律,将初始化向量通过密钥加密成密钥流(比特流),再与明文分组异或
- 模式补充:最后一个明文分组不需要填充(异或是不需要对应位数相同的,后面的OFB和CTR都是一个道理)
- 向量需求:需要初始化向量
初始化向量由加密者提供
初始化向量长度 == 分组数据长度
加密与解密使用的是同一个初始化向量
6.3.5 OFB(output feedback)
- 模式说明:先对初始化向量加密然后与第一个分组明文异或,然后对初始化向量加密结果再次加密再与第二个分组明文异或,以此类推
- 模式解密:解密过程是第一个分组与初始化向量加密异或,然后第二个分组与初始化向量加密后的结果再次加密异或,以此类推
- 模式特点:密文无规律,通过初始化向量借助密钥加密生成密钥流
- 模式补充:最后一个明文分组不需要填充
- 向量需求:需要初始化向量
- 特殊特点:密钥流加密过程和异或过程是两条不同的运算过程,因此密钥流加密和异或可以并发执行, 相较于CFB速度快效率高。
初始化向量由加密者提供
初始化向量长度 == 分组数据长度
加密与解密使用的是同一个初始化向量
6.3.6 CTR(counter)
- 模式说明:先使用计数器生成随机数,然后与密钥加密后和第一个分组明文异或。
- 然后随机数+1后再次与密钥加密,加密后和第二个分组明文异或。以此类推。
- 模式解密:解密过程是计数器生成随机数,然后与密钥加密后和第一个分组密文异或
- 然后随机数+1后再次与密钥加密,加密后和第二个分组密文异或。以此类推。
- 模式特点:密文无规律,通过【计数器+随机数】借助密钥加密生成密钥流
- 模式补充:最后一个明文分组不需要填充
- 向量需求:不需要初始化向量,但需要计数器和随机数
- 特殊特点:切记异或的特征,一次异或是加密,再次异或就能够回到初始状态。