Go語言與AES加密演算法 —— 簡介、AES演算法案例
阿新 • • 發佈:2018-11-25
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加密,並將加密好的資料放入目標變數中。
其解密過程就是一個相反的過程。