Go语言与AES加密算法 —— 简介、AES算法案例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/The_Reader/article/details/83997188

AES简介

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。AES加密有很多轮的重复和变换。(微信小程序加密传输就是用这个加密算法的)明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节即(128,192,256位)。根据密钥的长度,算法被称为AES-128,AES-192或者AE-256。

话不多说,直接上案例:

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"fmt"
	"encoding/hex"

	"go_demo/密码学/utils"
)

//AES加密
//src:明文  key:密钥
//返回值:加密之后的密文
func EncryptAES(src, key []byte) []byte {
	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err)
	}
	src = utils.PaddingText(src, block.BlockSize())
	blockMode := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])
	dst := make([]byte, len(src))
	blockMode.CryptBlocks(dst, src)
	return dst
}


func DecryptAES(src, key []byte) []byte {
	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err)
	}
	blockMode := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])
	dst := make([]byte,len(src))
	blockMode.CryptBlocks(dst, src)
	dst = utils.UnPaddingText(dst)
	return dst
}


func main() {
	src := []byte("i  am  wek $$ The_Reader ")
	key := []byte("1234567887654321")
	encrypt_msg := EncryptAES(src, key)
	fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))
	decrypt_msg := DecryptAES(encrypt_msg, key)
	fmt.Println("decrypt_msg = ", string(decrypt_msg))
}

所用到的工具包

//填充最后一组数据
//src:待填充的数据, blocksize:每一个块的大小
func PaddingText(src []byte, blocksize int) []byte {
	padding := blocksize - len(src) % blocksize
	padText := bytes.Repeat([]byte{byte(padding)}, padding)
	newText := append(src, padText...)
	return newText
}

func UnPaddingText(src []byte) []byte {
	len := len(src)
	number := int(src[len-1])
	newText := src[:len-number]
	return newText
}

运行结果:

 

 其加密过程是:

根据key生成一个块,然后根据块长度,将源文件尾部填充为blocksize的倍数,然后根据CBC模式得到blockmode,再用blockmode的cryptoBlcok加密,并将加密好的数据放入目标变量中。

其解密过程就是一个相反的过程。

猜你喜欢

转载自blog.csdn.net/The_Reader/article/details/83997188