1. 程式人生 > >Go語言與AES加密演算法 —— 簡介、AES演算法案例

Go語言與AES加密演算法 —— 簡介、AES演算法案例

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加密,並將加密好的資料放入目標變數中。

其解密過程就是一個相反的過程。