Golang 使用 AES-GCM

心得

因為專案的關係需要用到 aes-gcm 就把它封裝成 function 來方便平常使用

AES-GCM

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"fmt"
)

func encrypt(plaintext, key, nonce []byte) []byte {
	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err.Error())
	}

	aesgcm, err := cipher.NewGCM(block)
	if err != nil {
		panic(err.Error())
	}

	ciphertext := aesgcm.Seal(nil, nonce, plaintext, nil)

	return ciphertext
}

func decrypt(ciphertext, key, nonce []byte) []byte {
	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err.Error())
	}

	aesgcm, err := cipher.NewGCM(block)
	if err != nil {
		panic(err.Error())
	}

	plaintext, err := aesgcm.Open(nil, nonce, ciphertext, nil)
	if err != nil {
		panic(err.Error())
	}
	return plaintext
}

func main() {
	fmt.Println("AES encryption with GCM")
	plaintext := []byte("Some plain text")
	key := []byte("secretkey32bytessecretkey32bytes")
	nonce := make([]byte, 12)

	ciphertext := encrypt(plaintext, key, nonce)
	fmt.Printf("Ciphertext: %x\n", ciphertext)

	recoveredPt := decrypt(ciphertext, key, nonce)
	fmt.Printf("Recovered plaintext: %s\n", recoveredPt)
}

完成後需要使用到 AES-GCM 只需要用到兩個 function 分別是 encrypt 與 decrypt,也就是加密與解密,放入的參數有:原始資料、密碼與 nonce,這邊要注意密碼的部分只能是 16 bytes 或是 32 bytes,分別對應到 AES128GCMAES-256-GCM