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...)
}