golang实现AES ECB模式的加密和解密

前端之家收集整理的这篇文章主要介绍了golang实现AES ECB模式的加密和解密前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近有一个需求需要在golang中实现AES ECB模式的加密和解密,看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式,关于AES算法的几种模式原理大家可以去百度搜索一下,集中模式如下。

1.电码本模式(ElectronicCodebookBook(ECB))

2.密码分组链接模式(CipherBlockChaining(CBC))

3.计算器模式(Counter(CTR))

4.密码反馈模式(CipherFeedBack(CFB))

5.输出反馈模式(OutputFeedBack(OFB))


我这里采用的ECB加密基本原理是将明文切分成若干相同的小段,然后对每一段进行加密和解密,最后组合就是最终的结果,AES算法有AES-128、AES-192、AES-256三种,分别对应的key是 16、24、32字节长度,同样对应的加密解密区块长度BlockSize也是16、24、32字节长度。

下面贴上我的实现代码:

  1. package main
  2.  
  3. import (
  4. "bytes"
  5. "crypto/aes"
  6.  
  7. "fmt"
  8. )
  9.  
  10. //AES ECB模式的加密解密
  11. type AesTool struct {
  12. //128 192 256位的其中一个 长度 对应分别是 16 24 32字节长度
  13. Key []byte
  14. BlockSize int
  15. }
  16.  
  17. func NewAesTool(key []byte,blockSize int) *AesTool {
  18. return &AesTool{Key: key,BlockSize: blockSize}
  19. }
  20.  
  21. func (this *AesTool) padding(src []byte) []byte {
  22. //填充个数
  23. paddingCount := aes.BlockSize - len(src)%aes.BlockSize
  24. if paddingCount == 0 {
  25. return src
  26. } else {
  27. //填充数据
  28. return append(src,bytes.Repeat([]byte{byte(0)},paddingCount)...)
  29. }
  30. }
  31.  
  32. //unpadding
  33. func (this *AesTool) unPadding(src []byte) []byte {
  34. for i := len(src) - 1; ; i-- {
  35. if src[i] != 0 {
  36. return src[:i+1]
  37. }
  38. }
  39. return nil
  40. }
  41.  
  42. func (this *AesTool) Encrypt(src []byte) ([]byte,error) {
  43. //key只能是 16 24 32长度
  44. block,err := aes.NewCipher([]byte(this.Key))
  45. if err != nil {
  46. return nil,err
  47. }
  48. //padding
  49. src = this.padding(src)
  50. //返回加密结果
  51. encryptData := make([]byte,len(src))
  52. //存储每次加密的数据
  53. tmpData := make([]byte,this.BlockSize)
  54.  
  55. //分组分块加密
  56. for index := 0; index < len(src); index += this.BlockSize {
  57. block.Encrypt(tmpData,src[index:index+this.BlockSize])
  58. copy(encryptData,tmpData)
  59. }
  60. return encryptData,nil
  61. }
  62. func (this *AesTool) Decrypt(src []byte) ([]byte,err
  63. }
  64. //返回加密结果
  65. decryptData := make([]byte,this.BlockSize)
  66.  
  67. //分组分块加密
  68. for index := 0; index < len(src); index += this.BlockSize {
  69. block.Decrypt(tmpData,src[index:index+this.BlockSize])
  70. copy(decryptData,tmpData)
  71. }
  72. return this.unPadding(decryptData),nil
  73. }
  74.  
  75. //测试padding unpadding
  76. func TestPadding() {
  77. tool := NewAesTool([]byte{},16)
  78. src := []byte{1,2,3,4,5}
  79. src = tool.padding(src)
  80. fmt.Println(src)
  81. src = tool.unPadding(src)
  82. fmt.Println(src)
  83. }
  84.  
  85. //测试AES ECB 加密解密
  86. func TestEncryptDecrypt() {
  87. key := []byte{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}
  88. blickSize := 16
  89. tool := NewAesTool(key,blickSize)
  90. encryptData,_ := tool.Encrypt([]byte("32334erew32"))
  91. fmt.Println(encryptData)
  92. decryptData,_ := tool.Decrypt(encryptData)
  93. fmt.Println(string(decryptData))
  94. }
  95.  
  96. func main() {
  97. fmt.Println("Padding Test........")
  98. TestPadding()
  99. fmt.Println("AES ECB加密解密测试........")
  100. TestEncryptDecrypt()
  101. }

猜你在找的Go相关文章