Go

Go 实现AES-128加密解密

2018-05-23  本文已影响548人  Li_MAX

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

加解密流程图:

image

代码如下

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

package main
​
import (
 "crypto/cipher"
 "crypto/aes"
 "bytes"
 "fmt"
)
​
//AES加密解密
​
​
func main() {
​
 //设置是要
 key := []byte("1234567890123456")
 //明文
 origData := []byte("hello world")
 //加密
 en := AESEncrypt(origData,key)
 //解密
 de := AESDecrypt(en,key)
 fmt.Println(string(de))
}
​
//解密
func AESDecrypt(crypted,key []byte)[]byte{
 block,_ := aes.NewCipher(key)
 blockSize := block.BlockSize()
 blockMode := cipher.NewCBCDecrypter(block,key[:blockSize])
 origData := make([]byte,len(crypted))
 blockMode.CryptBlocks(origData,crypted)
 origData = PKCS7UnPadding(origData)
 return origData
}
​
//去补码
func PKCS7UnPadding(origData []byte)[]byte{
 length := len(origData)
 unpadding := int(origData[length-1])
 return origData[:length-unpadding]
}
//加密
func AESEncrypt(origData,key []byte)[]byte{
 //获取block块
 block,_ :=aes.NewCipher(key)
 //补码
 origData = PKCS7Padding(origData, block.BlockSize())
 //加密模式,
 blockMode := cipher.NewCBCEncrypter(block,key[:block.BlockSize()])
​
 //创建明文长度的数组
 crypted := make([]byte,len(origData))
​
 //加密明文
 blockMode.CryptBlocks(crypted,origData)
​
 return crypted
}
​
//补码
func PKCS7Padding(origData []byte,blockSize int)[]byte{
 //计算需要补几位数
 padding := blockSize-len(origData)%blockSize
 //在切片后面追加char数量的byte(char)
 padtext := bytes.Repeat([]byte{byte(padding)},padding)
​
 return append(origData,padtext...)
}
上一篇下一篇

猜你喜欢

热点阅读