天天看點

go加解密系列——AES加解密

AES是密碼學中的進階加密标準(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密标準。這個标準用來替代原先的DES(Data Encryption Standard),已經被多方分析且廣為全世界所使用。經過五年的甄選流程,進階加密标準由美國國家标準與技術研究院 (NIST)于2001年11月26日釋出于FIPS PUB 197,并在2002年5月26日成為有效的标準。2006年,進階加密标準已然成為對稱密鑰加密中最流行的算法之一。

該算法為比利時密碼學家Joan Daemen和Vincent Rijmen所設計,結合兩位作者的名字,以Rijdael之名命之,投稿進階加密标準的甄選流程。

常見的加解密模式有:ECB、CBC、CTR、OFB、CFB,常見的填充模式有:NoPadding、ZeroPadding、PKCS5Padding、PKCS7Padding

加解密模式對IV的要求

ECB 不需要IV
CBC 需要IV
CTR 需要IV
OFB 需要IV
CFB 需要IV

幾種填充模式

NoPadding 原始資料不補位,要求原始資料長度必須符合目前加密算法的block的整數倍,否則會報錯。優點是,當原始資料長度固定,生成的密文長度最小。
ZeroPadding 用0補位,缺點是無法區分目前的0是原始資料,還是補位資料
PKCS5Padding 缺N位補N值。缺點是補位是固定8位,無法适當目前算法的block大小
PKCS7Padding 缺N位補N值。以目前算法的block大小進行動态計算補位大小,适用性廣

 安裝依賴:

go get github.com/agclqq/goencryption
           

aes-cbc-pkcs7加密示例:

package main

import (
	"fmt"
	"github.com/agclqq/goencryption"
)

var plainText = []byte("lovegoencryption")
var key = []byte("qwertyui12345678poiuytre")  //Key的長度16, 24, 32 分别對應 AES-128, AES-192, AES-256
var iv = []byte("poiuytre12345678")

func main() {
	//使用aes-cbc-pkcs7進行加密
	cryptText, err := goencryption.AesCBCPkcs7Encrypt(plainText, key, iv)
	if err != nil {
		fmt.Println(err)
		return
	}
	//将不可列印密文轉為base64輸出
	out := goencryption.Base64Encode(cryptText)
	fmt.Println(out)

	//将out解碼為原始密文
	cText, err := goencryption.Base64Decode(out)
	if err != nil {
		fmt.Println(err)
		return
	}
	//使用aes-cbc-pkcs7進行解密
	text, err := goencryption.AesCBCPkcs7Decrypt(cText, key, iv)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("%s\n", text)
}
           

輸出

zq2IUVtrb0U8CeePzoNBlsmlV9WvW2xo
lovegoencryption
           

其他更多方法可參考 github.com/agclqq/goencryption/aes.go

更便利的 EasyEncrypt / EasyDecrypt:

package main

import (
	"fmt"
	"github.com/agclqq/goencryption"
)

var plainTextStr = "lovegoencryption"
var keyStr = "qwertyui12345678poiuytre"
var ivStr = "poiuytre12345678"

func main() {
	//使用aes-cbc-pkcs7進行加密,并用base64輸出
	cryptText, err := goencryption.EasyEncrypt("aes/cbc/pkcs7/base64", plainTextStr, keyStr, ivStr)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(cryptText)

	//使用base64轉碼,并用aes-cbc-pkcs7進行解密
	text, err := goencryption.EasyDecrypt("aes/cbc/pkcs7/base64", cryptText, keyStr, ivStr)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(text)
}
           

輸出

5LO0iKiy3wcmb+7cP0j73h1hXiDHPjbgVGNAPWWidnQ=
lovegoencryption