Go-AES算法详解与代码
目录
AES
发展史
概述
轮函数F
字节代换
行移位
列混淆
轮密钥加
密钥编排
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-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
轮函数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()上的多项式,再与一个固定的多项式c(x)进行模乘法,要求c(x) 是模可逆的多项式。 c(x)=’03’+’01’+’01’x+’02’。
轮密钥加
密钥编排
密钥编排指从种子密钥得到轮密钥的过程,AES的密钥编排由密钥扩展和轮密钥选取两部分组成,其基本原则如下:
- 轮密钥的总比特数等于轮数加1再乘以分组长度;如128比特的明文经过10轮的加密,则总共需 要(10+1)*128=1408比特的密钥.。
- 种子密钥被扩展成为扩展密钥;
- 轮密钥从扩展密钥中取,其中第1轮轮密钥取扩展密钥的前个字,第2轮轮密钥取接下来的个字,依次类推。
密钥扩展
扩展密钥是以4字节字为元素的一维阵列,表示为W[* (Nr +1)],其中前个字取为种子密钥, 以后每个字按递归方式定义。扩展算法根据≤6和>6有所不同。
轮密钥选取
轮密钥i(即第i个轮密钥)由轮密钥缓冲字 W[* i]到W[*(i+1)]给出
AES和DES的不同之处
- AES的密钥长度(128位、192位、256位)是可变的,而DES的 密钥长度固定为56位。
- DES是面向比特的运算,AES是面向字节的运算。
- AES的加密运算和解密运算不一致,因而加密器不能同时 用作解密器,而DES的加密器可用作解密器,只是子密钥 的顺序不同。
分组模式CTR
加密不同的明文分组所用的计数器值必须不同(模运 算,其中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进行加解密
// plainText:明文
// iv: 初始化向量
// key:密钥
// 返回密文/明文,以及错误
func AesEncrypt(plainText, iv,key []byte) ([]byte,error) {block, err :=aes.NewCipher(key)if err != nil{_, file, line, _ := runtime.Caller(0)return nil,util.Error(file,line+1,errors.AesKeyError)}if len(iv) != block.BlockSize(){_, file, line, _ := runtime.Caller(0)return nil,util.Error(file,line+1,errors.AesIvError)}// create a CTR interfacestream := cipher.NewCTR(block,iv)cipherText := make([]byte,len(plainText))// encrypt or decryptstream.XORKeyStream(cipherText,plainText)return cipherText,nil
}
代码我放到了gitee上:https://gitee.com/frankyu365/gocrypto
您可以查看仓库Readme文档或Go-包管理(管理工具对比及go mod的使用)来进行安装
测试代码
iv := []byte("12345678qwertyui")key:= []byte("12345678abcdefgh09876543alnkdjfh")plainText := []byte("Hi,I'm lady_killer9")cipherText,_ := aes.AesEncrypt(plainText,iv,key)fmt.Printf("加密后:%s\n",cipherText)decryptText,_ := aes.AesDecrypt(cipherText,iv,key)fmt.Printf("解密后:%s\n",decryptText)
参考
《现代密码学教程 谷利泽 杨义先等》
AES的发展史
Go标准库-crypto/aes
Go标准库-crypto/cipher
更多Go相关内容:Go-Golang学习总结笔记
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。
Go-AES算法详解与代码相关推荐
- 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码
粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...
- 数学建模——主成分分析算法详解Python代码
数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...
- 【分享实录】BANCOR算法详解及代码实现
1 活动基本信息 1)主题:[区块链技术工坊22期]BANCOR算法详解及代码实现 2)议题: BANCOR算法的特点和优劣势 BANCOR算法和举例 如何加入BANCOR.NETWORK交易所 如何 ...
- 技术工坊|BANCOR算法详解及代码实现(上海)
2019独角兽企业重金招聘Python工程师标准>>> EOS项目在RAM分配中采用了Bancor算法,并将RAM的价格爆炒到了很高的价位,凭借EOS项目在区块链领域的强大运营宣传能 ...
- 【区块链技术工坊22期实录】王登辉:BANCOR算法详解及代码实现
1,活动基本信息 1)题目: [区块链技术工坊22期]BANCOR算法详解及代码实现 2)议题: 1)BANCOR算法的特点和优劣势 2)BANCOR算法和举例 3)如何加入BANCOR.NETWOR ...
- 算法 经典的八大排序算法详解和代码实现
算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...
- [联邦学习] FedAvg聚合算法详解及代码实现
该文章首发于若绾 [联邦学习] FedAvg聚合算法详解及代码实现,转载请标注出处. 论文原文:Communication-Efficient Learning of Deep Networks fr ...
- KMP算法详解及代码
KMP算法详解及代码 KMP算法详解及代码 定义及应用 理论 基本概念 next 数组 总结 注意 代码 KMP算法详解及代码 最近正好在看字符串相关的算法内容,就顺便把KMP算法回顾了一下.相应的代 ...
- 谱聚类算法详解及代码实现
谱聚类算法详解及代码实现 文章目录 谱聚类算法详解及代码实现 参考 关于谱聚类介绍 谱聚类概述 谱聚类前置知识 无向权重图 邻接矩阵 度矩阵 拉普拉斯矩阵 相似度矩阵 确定目标函数 初始化目标函数(最 ...
最新文章
- Java多线程编写简易飞机大战(一)
- 用户报告性能缓慢的解决流程
- C C coding rule Using Directives Must Be Placed Within
- python3.x中的生成器generator调用next方法
- 【Android工具】安卓魔力播放器moliplayer绿色无广告,手机DLNA播放器
- Spring-AOP @AspectJ进阶之切点复合运算
- 参数整定临界比例度实验_PID理解起来很难?系统讲解PID控制及参数调节,理论加实际才好!...
- 【转】VTK与Qt整合的示例
- linux判断改行符_Linux判断符如何使用?
- apache+tomcat小记
- Chrome 终究走上了 IE 6 的老路
- mybatis缓存查找顺序
- java如何代码生成矩形_Java中能不能创建不是矩形的窗口。
- regexp函数 mysql_mysql 五中的REGEXP函数_mysql
- 钉钉的微应用如何测试;
- 群晖7.X关闭双重验证(OTP)的方法
- NPOI导出数据到Excel
- 【Windows 10 更新失败】Windows10 升级提示错误代码:0x80070020解决方案
- 刘宇凡:新型鸡汤如何击溃传统鸡汤?
- C#操作word定位光标