AES是分組密碼潦牛,即將明文分成一組一組的异希,每組長度相等健盒,每次加密一組數(shù)據(jù),直到整個加密完成
AES分組的長度只能是128位称簿,即分組為16個字節(jié)(每個字節(jié)8位)扣癣,簡單的說:明文P必須是長度為16的整數(shù)倍,字符串或數(shù)字憨降。
密鑰的長度可以使用128位父虑、192位或256位,簡單的說:密鑰K可以是長度為16,24,32的字符串或數(shù)字授药。分別對應的加密輪數(shù)為10,12,14频轿。
AES只是基本算法垂涯,實現(xiàn)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("要加密內(nèi)容"), 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("要加密的內(nèi)容"), 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)
}