目录

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. 轮密钥的总比特数等于轮数加1再乘以分组长度;如128比特的明文经过10轮的加密,则总共需 要(10+1)*128=1408比特的密钥.。
  2. 种子密钥被扩展成为扩展密钥
  3. 轮密钥从扩展密钥中取,其中第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算法详解与代码相关推荐

  1. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  2. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  3. 【分享实录】BANCOR算法详解及代码实现

    1 活动基本信息 1)主题:[区块链技术工坊22期]BANCOR算法详解及代码实现 2)议题: BANCOR算法的特点和优劣势 BANCOR算法和举例 如何加入BANCOR.NETWORK交易所 如何 ...

  4. 技术工坊|BANCOR算法详解及代码实现(上海)

    2019独角兽企业重金招聘Python工程师标准>>> EOS项目在RAM分配中采用了Bancor算法,并将RAM的价格爆炒到了很高的价位,凭借EOS项目在区块链领域的强大运营宣传能 ...

  5. 【区块链技术工坊22期实录】王登辉:BANCOR算法详解及代码实现

    1,活动基本信息 1)题目: [区块链技术工坊22期]BANCOR算法详解及代码实现 2)议题: 1)BANCOR算法的特点和优劣势 2)BANCOR算法和举例 3)如何加入BANCOR.NETWOR ...

  6. 算法 经典的八大排序算法详解和代码实现

    算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...

  7. [联邦学习] FedAvg聚合算法详解及代码实现

    该文章首发于若绾 [联邦学习] FedAvg聚合算法详解及代码实现,转载请标注出处. 论文原文:Communication-Efficient Learning of Deep Networks fr ...

  8. KMP算法详解及代码

    KMP算法详解及代码 KMP算法详解及代码 定义及应用 理论 基本概念 next 数组 总结 注意 代码 KMP算法详解及代码 最近正好在看字符串相关的算法内容,就顺便把KMP算法回顾了一下.相应的代 ...

  9. 谱聚类算法详解及代码实现

    谱聚类算法详解及代码实现 文章目录 谱聚类算法详解及代码实现 参考 关于谱聚类介绍 谱聚类概述 谱聚类前置知识 无向权重图 邻接矩阵 度矩阵 拉普拉斯矩阵 相似度矩阵 确定目标函数 初始化目标函数(最 ...

最新文章

  1. Java多线程编写简易飞机大战(一)
  2. 用户报告性能缓慢的解决流程
  3. C C coding rule Using Directives Must Be Placed Within
  4. python3.x中的生成器generator调用next方法
  5. 【Android工具】安卓魔力播放器moliplayer绿色无广告,手机DLNA播放器
  6. Spring-AOP @AspectJ进阶之切点复合运算
  7. 参数整定临界比例度实验_PID理解起来很难?系统讲解PID控制及参数调节,理论加实际才好!...
  8. 【转】VTK与Qt整合的示例
  9. linux判断改行符_Linux判断符如何使用?
  10. apache+tomcat小记
  11. Chrome 终究走上了 IE 6 的老路
  12. mybatis缓存查找顺序
  13. java如何代码生成矩形_Java中能不能创建不是矩形的窗口。
  14. regexp函数 mysql_mysql 五中的REGEXP函数_mysql
  15. 钉钉的微应用如何测试;
  16. 群晖7.X关闭双重验证(OTP)的方法
  17. NPOI导出数据到Excel
  18. 【Windows 10 更新失败】Windows10 升级提示错误代码:0x80070020解决方案
  19. 刘宇凡:新型鸡汤如何击溃传统鸡汤?
  20. C#操作word定位光标

热门文章

  1. java 异常后重试_java – 异常后自动重试的功能
  2. 抛重又叫泡货,通俗的讲就是轻货
  3. 不要把时间浪费在无用的社交上
  4. 一款做U盘启动盘的软件
  5. 万用表怎么测电池内阻_五种最实用方法教你如何精确测量蓄电池内阻
  6. LoadRunner基础
  7. 银河atx电源检修实例
  8. json-rpc 调用btc、usdt钱包节点 java
  9. oracle部门分组员工平均工资,oracle分组查询
  10. 公务员面试常见题型及解题思路