Go-AES算法详解与代码(1)

列混淆

轮密钥加

密钥编排

AES和DES的不同之处

分组模式CTR

AES的Go实现

aes包

cipher包

加密/解密

参考


本篇介绍分组密码AES的相关内容及Go实现,分组密码算法设计思想及其他分组模式可查看文章:Go-Des和3Des算法详解与代码

AES

发展史

RSA公司举办过破译DES的比赛(DES Challenge):

  • 1997年的DES ChallengeI中用了96天
  • 1998年的DES ChallengeII-1中用了41天
  • 1998年的DES ChallengeII-2中用了56小时
  • 1999年的DES ChallengeII中用了22小时15分钟

DES被破解,3DES过度后终于迎来了AES。

  • 1997年4月15日,美国ANSI向全球发起征集AES(advanced encryptionstandard)的活动,并为此成立了AES工作小组。
  • 1997年9月12日,美国联邦登记处公布了正式征集AES候选算法的通告。对AES的基本要求是:比三重DES快、至少与三重DES一样安全、数据分组长度为128比特、密钥长度为128/192/256比特。
  • 1998年8月12日,在首届AES候选会议(first AES candidate conference)上公布了AES的15个候选算法,任由全世界各机构和个人攻击和评论。
  • 1999年3月,在第2届AES候选会议(second AES candidate conference)上经过对全球各密码机构和个人对候选算法分析结果的讨论,从15个候选算法中选出了5个。分别是RC6、Rijndael、SERPENT、Twofish和MARS。
  • 2000年4月13日至14日,召开了第3届AES候选会议(third AES candidateconference),继续对最后5个候选算法进行讨论。
  • 2000年10月2日,NIST宣布**Rijndael(Rijndael由比利时的Joan Daemen和Vincent Rijmen设计。算法的原型是 Square算法)**作为新的AES。经过3年多的公开讨论,Riindael终于脱颖而出。

概述

  • 分组加密算法:明文和密文分组可变长度。
  • SPN(S变换和P变换组成的变换网络)结构:轮函数包含代换层一置换层一密钥混合层。
版本密钥长度分组长度迭代轮数
AES-1284410
AES-1926412
AES-2568414

轮函数F

字节代换

列的每个元素作为输入用来指定S盒的地址:前4位指定S盒的后4位指定S盒的。由行和列所确定的S盒位置的元素取代了明文矩阵中相应位置的元素。

S盒如下(反向使用S^-1盒即可)

明文:10000111,前4位为8,后四位为7,替换为S(8,7)=17=00010001

行移位

行移位操作是作用于S盒的输出的,其中,列的4个行 螺旋 地左移,即第0行左移0字节第1行左移1字节第2行左移2字节第3行左移3字节,如下图所示。从该图中可以看出, 这使得列完全进行了重排,即在移位后的每列中,都包含有 未移位前每个列的一个字节。接下来就可以进行列内混合了。 (逆向行移位变换将中间态数据的后三行执行相反方向的移位操作)

列混淆

在列混淆变换中,将行移位后的状态阵列的每个列视为GF(2^8)上的多项式,再与一个固定的多项式c(x)进行模x^4+1乘法,要求c(x) 是模x^4+1可逆的多项式。 c(x)=’03’x^3+’01’x^2+’01’x+’02’。

轮密钥加

密钥编排

密钥编排指从种子密钥得到轮密钥的过程,AES的密钥编排由密钥扩展轮密钥选取两部分组成,其基本原则如下:

  1. 轮密钥的总比特数等于轮数加1再乘以分组长度;如128比特的明文经过10轮的加密,则总共需 要(10+1)*128=1408比特的密钥.。
  2. 种子密钥被扩展成为扩展密钥
  3. 轮密钥从扩展密钥中取,其中第1轮轮密钥取扩展密钥的前N_b个字,第2轮轮密钥取接下来的N_b个字,依次类推。

密钥扩展

扩展密钥是以4字节字为元素的一维阵列,表示为W[N_b* (Nr +1)],其中前N_k个字取为种子密钥, 以后每个字按递归方式定义。扩展算法根据N_k≤6和N_k>6有所不同。

轮密钥选取

轮密钥i(即第i个轮密钥)由轮密钥缓冲字 W[N_b* i]到W[N_b*(i+1)]给出

AES和DES的不同之处

  • AES的密钥长度(128位、192位、256位)是可变的,而DES的 密钥长度固定为56位。
  • DES是面向比特的运算,AES是面向字节的运算。
  • AES的加密运算和解密运算不一致,因而加密器不能同时 用作解密器,而DES的加密器可用作解密器,只是子密钥 的顺序不同。

分组模式CTR

加密不同的明文分组所用的计数器值必须不同(模2^d运 算,其中d是分组长度)。

AES的Go实现

aes包

func NewCipher(key []byte) (cipher.Block, error)

创建一个cipher.Block接口。参数key为密钥,长度只能是16、24、32字节,用以选择AES-128、AES-192、AES-256。

cipher包

func NewCTR(block Block, iv []byte) Stream

返回一个计数器模式的、底层采用block生成key流的Stream接口,初始向量iv的长度必须等于block的块尺寸。

stream接口的方法

XORKeyStream(dst, src []byte)

从加密器的key流和src中依次取出字节二者xor后写入dst,src和dst可指向同一内存地址

加密/解密

  • 使用aes.NewCipher获取块
  • 使用cipher.CTR转为CTR模式流
  • 使用stearm.XORKeyStream进行加解密
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**

![img](https://img-blog.csdnimg.cn/img_convert/8a48976d88d5e8440823c1bab11db0ac.png)

![img](https://img-blog.csdnimg.cn/img_convert/698ecd06001f858a337e4c3f2668c523.png)

![img](https://img-blog.csdnimg.cn/img_convert/27aea777096fa2e6369e9195c6da6922.png)

![img](https://img-blog.csdnimg.cn/img_convert/dc69c12fd1a34b21458a09848bab2717.png)

![img](https://img-blog.csdnimg.cn/img_convert/5f7c5de143741b470a6a9d5549aca3f7.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

1715488389922)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值