Go 实现AES-128加密解密

https://www.jianshu.com/p/d6ba9f6d62e9

AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES 使用几种不同的方法来执行排列和置换运算。 AES是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

加解密流程图:

代码如下

使用CBC模式+PKCS7 填充方式实现AES的加密和解密

  1. package main
  2. import (
  3. "crypto/cipher"
  4. "crypto/aes"
  5. "bytes"
  6. "fmt"
  7. )
  8. //AES加密解密
  9. func main() {
  10. //设置是要
  11. key := []byte("1234567890123456")
  12. //明文
  13. origData := []byte("hello world")
  14. //加密
  15. en := AESEncrypt(origData,key)
  16. //解密
  17. de := AESDecrypt(en,key)
  18. fmt.Println(string(de))
  19. }
  20. //解密
  21. func AESDecrypt(crypted,key []byte)[]byte{
  22. block,_ := aes.NewCipher(key)
  23. blockSize := block.BlockSize()
  24. blockMode := cipher.NewCBCDecrypter(block,key[:blockSize])
  25. origData := make([]byte,len(crypted))
  26. blockMode.CryptBlocks(origData,crypted)
  27. origData = PKCS7UnPadding(origData)
  28. return origData
  29. }
  30. //去补码
  31. func PKCS7UnPadding(origData []byte)[]byte{
  32. length := len(origData)
  33. unpadding := int(origData[length-1])
  34. return origData[:length-unpadding]
  35. }
  36. //加密
  37. func AESEncrypt(origData,key []byte)[]byte{
  38. //获取block块
  39. block,_ :=aes.NewCipher(key)
  40. //补码
  41. origData = PKCS7Padding(origData, block.BlockSize())
  42. //加密模式,
  43. blockMode := cipher.NewCBCEncrypter(block,key[:block.BlockSize()])
  44. //创建明文长度的数组
  45. crypted := make([]byte,len(origData))
  46. //加密明文
  47. blockMode.CryptBlocks(crypted,origData)
  48. return crypted
  49. }
  50. //补码
  51. func PKCS7Padding(origData []byte,blockSize int)[]byte{
  52. //计算需要补几位数
  53. padding := blockSize-len(origData)%blockSize
  54. //在切片后面追加char数量的byte(char)
  55. padtext := bytes.Repeat([]byte{byte(padding)},padding)
  56. return append(origData,padtext...)
  57. }