AES明文:128 bit 密文:128 bit 密钥:128/192/256 bit (分别需要10/12/14轮)
AES 标准最后评选出的算法是 Rijindale 算法,该算法支持密钥 128/192/256 bit ,分别需要 10/12/14 轮,本文讨论的是 128 bit密钥 。它的加密过程并没有使用 DES 的 feistel 结构,而是使用了一种新的 SPN 结构,需要 10-14 轮计算,如下图:

文章插图
其中每一轮计算过程如下:
- SubBytes(字节替换):以字节大小为索引,与s_box表中字节映射
- ShiftRows(行移位-扩散):从上到下从左到右的顺序组成 4 * 4 数组,从 0 行开始,第 n 行向左平移 n 个字节
- MixColums(列混肴-扩散):对每一列进行矩阵运算,共四列
- AddRoundKey(轮密钥加):与轮密钥即子密钥异或运算
- 最后一轮没有列混淆
- 加密时:SubBytes -> ShiftRows -> MixColums -> AddRoundKey 解密时:AddRoundkey -> InvMixColums -> InvShiftRows -> InvSubBytes (Inv代表逆运算)
func TestAesEncrypt(t *testing.T){key:=[]byte{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}cipherBlock,err:=aes.NewCipher(key)if err!=nil{t.Error(err)}src:=[]byte{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}encrptDst :=make([]byte,len(src))cipherBlock.Encrypt(encrptDst,src)t.Log(encrptDst)plainDst:=make([]byte,len(encrptDst))cipherBlock.Decrypt(plainDst, encrptDst)t.Log(plainDst)}//out [19 7 34 196 163 153 225 186 223 245 40 131 80 80 70 203]//out [1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8]
迭代模式以上讨论的三种加密算法都是分组密码,每次只能处理特定长度的一块数据,例如 DES 和 3DES 能处理的这块数据长度为 8 bytes,AES 的为 16 bytes 。而我们的日常需要加密的明文基本上都是大于这个长度,这就需要我们将明文的内容进行分组并迭代加密,这个迭代加密的方式就是模式 。ECB 模式电子密码本模式(electronic codebook ),最简单的模式,将明文分组直接作为加密算法的输入,加密算法的输出直接作为密文分组 。
CBC 模式密文分组链接模式(Cipher Block Chaining),密文之间是链状的,明文分组跟上个密文分组异或之后作为加密算法的输入,加密算法的输出作为密文分组 。第一个明文分组加密时需要一个初始化向量 。
CFB 模式密文反馈模式(Cipher FeedBack),上一个密文分组作为下一个加密算法的输入,加密算法的输出与明文分组异或结果作为密文分组 。同样需要一个初始化向量
OFB 模式输出反馈模式(OutPut FeedBack),上一个加密算法的输出作为下一个加密算法的输入,明文与加密算法的输出异或作为密文分组 。需要初始化向量
CTR 模式计数器模式(Counter),将计数器作为加密算法的输入,加密算法的输出与明文分组异或作为密文分组,计数器是累加的 。需要一个初始的计数器值
以上各种模式,ECB 不推荐使用golang 代码实战:
func TestCBCMode(t *testing.T) {key:=[]byte{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}cipherBlock,err:=aes.NewCipher(key)if err!=nil{t.Error(err)}src:=[]byte{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}inv:=[]byte{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}cbcEncrypter:=cipher.NewCBCEncrypter(cipherBlock,inv)encrptDst :=make([]byte,len(src))cbcEncrypter.CryptBlocks(encrptDst,src)t.Log(encrptDst)plainDst:=make([]byte,len(encrptDst))cbcDecrypter:=cipher.NewCBCDecrypter(cipherBlock,inv)cbcDecrypter.CryptBlocks(plainDst,encrptDst)t.Log(plainDst)}//out [182 174 175 250 117 45 192 139 81 99 151 49 118 26 237 0 98 117 59 208 145 166 116 62 43 199 115 70 250 251 56 226]//out [1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8]
【密码学系列 - 对称加密】
推荐阅读
- 什么香水好闻又持久?这5款才最受女生喜爱的系列,你集齐了吗?
- 美甲|夏日心动美甲系列?,花朵手绘清新百搭,氛围感十足!
- 真我|狂销200万台!千元神机realme Q3系列好评率达97%
- 华日家具系列 华日家具实木家具怎么样
- 真我|新一代千元机皇!realme Q5系列上架:高通骁龙870加持
- 发布|新一代千元机皇!realme Q5系列4月20日发布:唯一骁龙870+80W闪充
- 企业网站维护教程:解决Nginx的80端口占用导致的一系列问题
- 黄茶属于红茶系列吗,安徽的霍山黄芽属于绿茶吗
- 匡威鞋头不对称是正品吗 匡威鞋头一大一小正常吗
- window提权系列之本地溢出exploit,让你的电脑成为肉鸡