小编给大家分享一下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对称加密