首页 > 编程知识 正文

aes算法例题,go语言高级编程

时间:2023-05-06 17:21:35 阅读:29208 作者:523

目录

AES

发展史

概要

循环函数f

字节替换

生产线移位

队伍乱七八糟

循环密钥加法

关键组织

AES和DES的区别

分组模式CTR

实现AES的Go

人工智能包

cipher包

加密/解密

参考资料

本文介绍了分组密码AES的相关内容和Go的实现,可以看到关于分组密码算法的设计思想和其他分组模式的文章: Go-Des和3Des算法的细节和代码

AES发展史RSA公司举办了解读DES的比赛(DES Challenge )。

1997年DES ChallengeI中为96天1998年DES ChallengeII-1中为41天1998年DES ChallengeII-2中为http://1999年的DES ChallengeII破译了56小时DES,直到3DES过剩才迎来了AES。

1997年4月15日,美国ANSI发起了向世界招募高级加密标准(AES )的活动,并为此成立了AES工作组。 1997年9月12日,美国联邦注册处发布了正式招募AES候选算法的通告。 对AES的基本要求是快于三个DES,至少与三个DES一样安全,数据分组长度为128位,密钥长度为128/192/256位。 1998年8月12日,在第一届AES候选人会议(first AES candidate conference )上发布了AES的15个候选算法,可以受到全世界各机构和个人的攻击和评论。 1999年3月,第二届AES候选人会议(second AES candidate conference )经过全球各密码机构和个人对候选算法分析结果的研究,从15种候选算法中选择了5种。 是RC6、Rijndael、SERPENT、Twofish和MARS。 2000年4月13日至14日,召开了第三次AES候选人会议(third AES candidateconference ),就最后五种候选算法继续进行讨论。 2000年10月2日,NIST宣布22小时15分钟Rijndael由比利时的Joan Daemen和Vincent Rijmen设计。 算法原型以Square算法Rijndael(为新的AES。 经过三年多的公开讨论,Riindael终于脱颖而出。 组加密算法概述:明文和密文分组可变长度。 SPN (由s变换和p变换组成的变换网络)结构:循环函数包含置换层

一置换层一密钥混合层。版本密钥长度分组长度迭代轮数AES-1284410AES-1926412AES-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()上的多项式,再与一个固定的多项式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("加密后:%sn",cipherText)decryptText,_ := aes.AesDecrypt(cipherText,iv,key)fmt.Printf("解密后:%sn",decryptText)

 

参考

《现代密码学教程 谷利泽 杨义先等》

AES的发展史

Go标准库-crypto/aes

Go标准库-crypto/cipher

更多Go相关内容:Go-Golang学习总结笔记

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。