go语言实现AES加密(AES-128 密钥长度和 ECB 加密模式)
- 密钥长度:128
- 加密模式:ECB
密钥长度和加密模式
- 密钥长度:AES 支持三种密钥长度:128位、192位和256位。更长的密钥提供更高的安全级别,但也可能会降低加密和解密的速度。
- 加密模式:AES 有多种加密模式,例如 ECB(电子密码本模式)、CBC(密码块链接模式)、CFB(密码反馈模式)等。不同的模式对加密过程和结果有不同的影响,选择合适的模式对于确保数据安全至关重要。
需求来源
在做OPPO广告主转化数据接入时,需要用到AES加密。 此为go语言实现
demo可以直接执行 AESEncryptCode("123")
执行
demo
package src
import (
"bytes"
"crypto/aes"
"encoding/base64"
"errors"
"fmt"
)
// AESEncryptCode("123") 执行加密
// pkcs7Padding 对数据块进行PKCS#7填充
func pkcs7Padding(src []byte, blockSize int) []byte {
padding := blockSize - len(src)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(src, padtext...)
}
// pkcs7UnPadding 去除PKCS#7填充
func pkcs7UnPadding(src []byte) ([]byte, error) {
length := len(src)
if length == 0 {
return nil, errors.New("invalid padding")
}
unpadding := int(src[length-1])
if unpadding > length {
return nil, errors.New("invalid padding")
}
return src[:(length - unpadding)], nil
}
// encryptAES128ECB 使用AES-128和ECB模式加密数据
func encryptAES128ECB(plaintext, key []byte) ([]byte, error) {
// 对base64编码的密钥进行解码
decodedKey, err := base64.StdEncoding.DecodeString(string(key))
if err != nil {
return nil, err
}
// 截断密钥到AES-128的长度(16字节)
block, err := aes.NewCipher(decodedKey[:16])
if err != nil {
return nil, err
}
// 对明文进行PKCS#7填充
paddedText := pkcs7Padding(plaintext, block.BlockSize())
// 初始化加密后的数据块
ciphertext := make([]byte, len(paddedText))
// 使用ECB模式进行加密(简单地对每个块进行加密)
for bs, be := 0, block.BlockSize(); bs < len(paddedText); bs, be = bs+block.BlockSize(), be+block.BlockSize() {
block.Encrypt(ciphertext[bs:be], paddedText[bs:be])
}
// 对加密后的数据进行base64编码
encodedCiphertext := base64.StdEncoding.EncodeToString(ciphertext)
return []byte(encodedCiphertext), nil
}
// AES加密 AES-128密钥长度和ECB加密模式
func AESEncryptCode(str string) (string, error) {
// base64编码的AES-128密钥
base64Key := "XGAXicVG5GMBsx5bueOe4wAB" // 替换这个密钥
key := []byte(base64Key)
// 要加密的明文
plaintext := []byte(str)
// 加密
ciphertext, err := encryptAES128ECB(plaintext, key)
if err != nil {
fmt.Println("加密失败:", err)
return "", err
}
code := string(ciphertext)
fmt.Printf("加密前后的密文(base64编码): %s -> %s \n", str, ciphertext)
// logrus.Info("code: ", code)
// logrus.Info("ciphertext : %s:", ciphertext)
// fmt.Printf("加密后的密文(base64编码): %s\n", ciphertext)
// fmt.Printf("加密后的密文(base64编码): %s\n", ciphertext)
// 注意:解密逻辑未在此示例中提供,但你可以使用类似的逻辑和pkcs7UnPadding函数来实现
return code, nil
}