【go语言实现AES加密(AES-128 密钥长度和 ECB 加密模式)】

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
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值