AES是分组密码,即将明文分成一组一组的,每组长度相等,每次加密一组数据,直到整个加密完成
AES分组的长度只能是128位,即分组为16个字节(每个字节8位),简单的说:明文P必须是长度为16的整数倍,字符串或数字。
密钥的长度可以使用128位、192位或256位,简单的说:密钥K可以是长度为16,24,32的字符串或数字。分别对应的加密轮数为10,12,14。
AES只是基本算法,实现AES有几个模式:ECB、CBC、CFB、OFB
package main
import (
"fmt"
"github.com/gogf/gf/crypto/gaes"
)
func main() {
//aesEncrypt()
//aesDecrypt()
//aesEncryptCFB()
//aesDecryptCFB()
//aesPKCS5Padding()
//aesPKCS5UnPadding()
//aesZeroPadding()
aesZeroUnPadding()
}
var key = []byte("1234567890123456")
var padding = 10
// 加密 cbc模式的别名
func aesEncrypt() {
encrypt, err := gaes.Encrypt([]byte("要加密内容"), key)
if err != nil {
panic(err)
}
fmt.Println(encrypt)
fmt.Printf("%s\n", encrypt)
}
// 解密 cbc模式的别名
func aesDecrypt() {
decrypt, err := gaes.Decrypt([]byte{19, 5, 111, 198, 120, 205, 98, 42, 75, 155, 234, 75, 166, 18, 246, 7}, key)
if err != nil {
panic(err)
}
fmt.Println(decrypt)
fmt.Printf("%s\n", decrypt)
}
// cfb模式
// 密钥必须为16/24/32位长度
func aesEncryptCFB() []byte {
encryptCFB, err := gaes.EncryptCFB([]byte("要加密的内容"), key, &padding)
if err != nil {
panic(err)
}
fmt.Println(encryptCFB)
fmt.Printf("%s\n", encryptCFB)
return encryptCFB
}
// cfb 解密
func aesDecryptCFB() {
cipherText := aesEncryptCFB()
cfb, err := gaes.DecryptCFB(cipherText, key, padding)
if err != nil {
panic(err)
}
fmt.Println(cfb)
fmt.Printf("%s\n", cfb)
}
// PKCS5Padding
func aesPKCS5Padding() []byte {
return gaes.PKCS5Padding([]byte("hello"), 64)
}
// PKCS5UnPadding
func aesPKCS5UnPadding() {
b := aesPKCS5Padding()
byte_data, err := gaes.PKCS5UnPadding(b, 64)
if err != nil {
panic(err)
}
fmt.Println(byte_data)
fmt.Printf("%s\n", byte_data)
}
// ZeroPadding
func aesZeroPadding()([]byte, int) {
b, n := gaes.ZeroPadding([]byte("hello"), 10)
return b, n
}
// ZeroUnPadding
func aesZeroUnPadding() {
b, n := aesZeroPadding()
data := gaes.ZeroUnPadding(b, n)
fmt.Println(data)
fmt.Printf("%s\n", data)
}