Golang如何实现AES对称加密

  介绍

小编给大家分享一下Golang如何实现AES对称加密,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

AES加密

<强> AES对称加密简介
AES是一个对称密码,旨在取代DES成为广泛使用的标准。是美国联邦政府采用的一种区块加密标准。

<强> AES对称加密过程
加密解密算法的输入是一个128位分组。这些分组被描述成4×4的字节方阵,这个分组被复制到数组中,并在加密和解密的每一阶段都被修改。在字节方阵中,每一格都是一个字,包含了4字节。在矩阵中字是按列排序的。
加密由N轮构成,轮数依赖于密钥长度:16字节密钥对应10轮,24字节密钥对应12轮,32字节对应14轮。

<强> AES加密模式

1。电码本模式(电子码书(ECB)

央行模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。

2。密码分组链接模式(密码块链接(CBC))

这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

3。密码反馈模式(密码反馈(CFB)
隐藏了明文模式,分组密码转化为流模式,可以及时加密传送小于分组的数据

4。富含(b输出反馈,输出反馈)模式
隐藏了明文模式,,分组密码转化为流模式,可以及时加密传送小于分组的数据

<强> AES填充方式
AES支持支持几种填充:NoPadding, PKCS5Padding, ISO10126Padding, PaddingMode.Zeros PaddingMode。PKCS7。对于AES来说PKCS5Padding和PKCS7Padding是完全一样的,不同在于PKCS5限定了块大小为8个字节而PKCS7没有限定。因此对于AES来说两者完全相同

Golang实现AES加密解密

下面附上Golang实现AES加密央行模式的源码:

package 主要   import  (   “bytes"   “加密/aes"   “fmt"   “testing"   )//欧洲央行模式解密   func  ECBDecrypt(地穴,key []字节),([]字节,,错误),{   if  ! validKey(关键),{   nil, return  fmt.Errorf(“秘钥长度错误,当前传入长度为,% d", len(关键))   }   if  len(地下室),& lt;, 1, {   nil, return  fmt.Errorf(“源数据长度不能为0,)   }   块,err :=, aes.NewCipher(关键)   if  err  !=, nil  {   return  nil,犯错   }   if  len(地下室)% block.BlockSize (), !=, 0, {   nil, return  fmt.Errorf(“源数据长度必须是,% d 的整数倍,当前长度为:% d", block.BlockSize (),, len(地下室))   }   var  dst []字节   tmpData :=,([]字节,,block.BlockSize ())      for  index :=, 0;, index  & lt;, len(地下室);,index  +=, block.BlockSize (), {   block.Decrypt (tmpData,地穴[指数:指数+ block.BlockSize ()))   时间=dst 附加(dst, tmpData…)   }   dst, err =, PKCS5UnPadding (dst)   if  err  !=, nil  {   return  nil,犯错   }   return  dst, nil   }//欧洲央行模式加密   func  ECBEncrypt (src, key []字节),([]字节,,错误),{   if  ! validKey(关键),{   nil, return  fmt.Errorf(“秘钥长度错误,,当前传入长度为,% d", len(关键))   }   块,err :=, aes.NewCipher(关键)   if  err  !=, nil  {   return  nil,犯错   }   if  len (src), & lt;, 1, {   nil, return  fmt.Errorf(“源数据长度不能为0,)   }   时间=src  PKCS5Padding (src, block.BlockSize ())   if  len (src) % block.BlockSize (), !=, 0, {   nil, return  fmt.Errorf(“源数据长度必须是,% d 的整数倍,当前长度为:% d", block.BlockSize (),, len (src))   }   var  dst []字节   tmpData :=,([]字节,,block.BlockSize ())   for  index :=, 0;, index  & lt;, len (src);, index  +=, block.BlockSize (), {   block.Encrypt (tmpData, src[指数:指数+ block.BlockSize ()))   时间=dst 附加(dst, tmpData…)   }   return  dst, nil   }//,PKCS5填充   func  PKCS5Padding (ciphertext []字节,blockSize  int), [] byte  {   padding :=, blockSize 安康;len(密文)% blockSize   padtext :=, bytes.Repeat([]字节{字节(垫)},,填充)   return 附加(密文,padtext…)   }//,去除PKCS5填充   func  PKCS5UnPadding (origData []字节),([]字节,,错误),{   length :=, len (origData)   unpadding :=, int (origData[长度是1])      if  length  & lt;, unpadding  {   nil, return  fmt.Errorf (“invalid  unpadding  length")   }   return  origData [: (length 作用;unpadding)], nil   }//,秘钥长度验证   func  validKey (key []字节),bool  {   k :=, len(关键)   switch  k  {   默认值:   return 假   case  16日,24日,32:   return 真正的   }   }      func 外种皮(t  * testing.T) {   srcData :=,“hello  world  !“   key :=,[]字节(“abcdabcdabcdabcdabcdabcdabcdabcd")//测试加密   encData  err :=, ECBEncrypt([]字节(srcData),(关键))   if  err  !=, nil  {   t.Errorf (err.Error ())   返回   }//测试解密   decData  err :=, ECBDecrypt (encData,键)   if  err  !=, nil  {   t.Errorf (err.Error ())   返回   }   t.Log (string (decData))   }

Golang如何实现AES对称加密