AES 对称加密中的 ECB 实现

Posted 魏小言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AES 对称加密中的 ECB 实现相关的知识,希望对你有一定的参考价值。

AES 对称加密中的 CBC 实现


AES 对称加密

加密策略包含:对称、非对称、不可逆…等多种加密模式,用于密码学、工学…等多个学科领域。
互联网常规用法,是为保障核心数据的安全传输及证书鉴权采取加密策略。开源的工具包,棱角比较明显,加密对象及密钥需要符合一定的设计。【比如,位数限制…等】

这里简单介绍一下封装完毕,直接可以采用的方式。有需要的同学,可以拿去修饰使用。

ECB 算法实现

针对每个加密策略,其实拥有很多种实现方式。比如 AES 加密,有 ECB 、GCM、CBC…等多种实现算法。

今天这里介绍一种 ECB 模式实现。

package main

import (
	"fmt"
	"encoding/hex"
	"bytes"
	"crypto/aes"
)

// AesTool AES ECB模式的加密解密
type AesTool struct 
	//128 192 256位的其中一个 长度 对应分别是 16 24 32字节长度
	Key       []byte
	BlockSize int


func NewAesTool(key []byte, blockSize int) *AesTool 
	return &AesToolKey: key, BlockSize: blockSize


func (a *AesTool) padding(src []byte) []byte 
	if len(src)%a.BlockSize == 0 
		//不用填充
		return src
	

	//填充个数
	paddingCount := a.BlockSize - len(src)%a.BlockSize
	//填充数据
	return append(src, bytes.Repeat([]bytebyte(0), paddingCount)...)


func (a *AesTool) unPadding(src []byte) []byte 
	for i := len(src) - 1; i >= 0; i-- 
		if src[i] != 0 
			return src[:i+1]
		
	
	return nil


func (a *AesTool) Encrypt(src []byte) ([]byte, error) 
	//key只能是 16 24 32长度
	block, err := aes.NewCipher([]byte(a.Key))
	if err != nil 
		return nil, err
	
	//padding
	src = a.padding(src)

	//返回加密结果
	encryptData := make([]byte, 0, len(src))
	//存储每次加密的数据
	tmpData := make([]byte, a.BlockSize)

	//分组分块加密
	for index := 0; index < len(src); index += a.BlockSize 
		block.Encrypt(tmpData, src[index:index+a.BlockSize])
		encryptData = append(encryptData, tmpData...)
	
	return encryptData, nil


func (a *AesTool) Decrypt(src []byte) ([]byte, error) 
	//key只能是 16 24 32长度
	block, err := aes.NewCipher([]byte(a.Key))
	if err != nil 
		return nil, err
	
	//返回加密结果
	decryptData := make([]byte, 0, len(src))
	//存储每次加密的数据
	dst := make([]byte, a.BlockSize)

	if len(src)%a.BlockSize != 0 
		return nil, nil
	

	//分组分块解密
	for index := 0; index < len(src); index += a.BlockSize 
		block.Decrypt(dst, src[index:index+a.BlockSize])
		decryptData = append(decryptData, dst...)
	

	if len(decryptData) != len(src) 
		return nil, nil
	
	return a.unPadding(decryptData), nil


func ECBDecrypter(appKey, param string) (string, error) 
	encMarkHex, _ := hex.DecodeString(param)
	key, encryptData := []byte(appKey), encMarkHex
	tool := NewAesTool(key, 16)
	decryptData, err := tool.Decrypt(encryptData)
	if err != nil 
		return "", err
	
	return string(decryptData), nil


func ECBEncrypter(appKey, param string) ([]byte, error) 
	key, originData := []byte(appKey), []byte(param)
	tool := NewAesTool(key, 16)
	encryptData, err := tool.Encrypt(originData)
	if err != nil 
		return nil, err
	
	return encryptData, nil

func main() 
    key := "QUAHSOJKDJSKDJXH"
    arm := "hello world"

	ciphertext, _ := ECBEncrypter(key, arm)
	screat := hex.EncodeToString(ciphertext)

	fmt.Println(screat)

	plaintext, _ := ECBDecrypter(key, screat)
	fmt.Println(plaintext)


加密实例

2ca4e82ac182a25862bdf704f7c40e67 //密文
hello world //明文

以上是关于AES 对称加密中的 ECB 实现的主要内容,如果未能解决你的问题,请参考以下文章

对称加密算法(AES/ECB/PKCS5Padding)之ECB模式

对称加密算法(AES/ECB/PKCS5Padding)之ECB模式

实现 base64+gzip+AES-ECB加密解密

对称加密算法的分组模式及其Go语言实现

python Crypto AES-256-ECB 与PHP之间完成加解密

iOS逆向之对称算法(下)