golang实现AES ECB模式的加密和解密

最近有一个需求需要在golang中实现AES ECB模式的加密和解密,  看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式,关于AES算法的几种模式原理大家可以去百度搜索一下,集中模式如下。

1. 电码本模式(Electronic Codebook Book (ECB))

 2.密码分组链接模式(Cipher Block Chaining (CBC))

 3.计算器模式(Counter (CTR))

 4.密码反馈模式(Cipher FeedBack (CFB))

 5.输出反馈模式(Output FeedBack (OFB))

我这里采用的ECB加密基本原理是将明文切分成若干相同的小段,然后对每一段进行加密和解密,最后组合就是最终的结果,AES算法有AES-128、AES-192、AES-256三种,分别对应的key是 16、24、32字节长度,同样对应的加密解密区块长度BlockSize也是16、24、32字节长度。

下面贴上我的实现代码:

package main

import (
	"bytes"
	"crypto/aes"

	"fmt"
)

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

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

func (this *AesTool) padding(src []byte) []byte {
	//填充个数
	paddingCount := aes.BlockSize - len(src)%aes.BlockSize
	if paddingCount == 0 {
		return src
	} else {
		//填充数据
		return append(src, bytes.Repeat([]byte{byte(0)}, paddingCount)...)
	}
}

//unpadding
func (this *AesTool) unPadding(src []byte) []byte {
	for i := len(src) - 1; ; i-- {
		if src[i] != 0 {
			return src[:i+1]
		}
	}
	return nil
}

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

	//分组分块加密
	for index := 0; index < len(src); index += this.BlockSize {
		block.Encrypt(tmpData, src[index:index+this.BlockSize])
		copy(encryptData, tmpData)
	}
	return encryptData, nil
}
func (this *AesTool) Decrypt(src []byte) ([]byte, error) {
	//key只能是 16 24 32长度
	block, err := aes.NewCipher([]byte(this.Key))
	if err != nil {
		return nil, err
	}
	//返回加密结果
	decryptData := make([]byte, len(src))
	//存储每次加密的数据
	tmpData := make([]byte, this.BlockSize)

	//分组分块加密
	for index := 0; index < len(src); index += this.BlockSize {
		block.Decrypt(tmpData, src[index:index+this.BlockSize])
		copy(decryptData, tmpData)
	}
	return this.unPadding(decryptData), nil
}

//测试padding  unpadding
func TestPadding() {
	tool := NewAesTool([]byte{}, 16)
	src := []byte{1, 2, 3, 4, 5}
	src = tool.padding(src)
	fmt.Println(src)
	src = tool.unPadding(src)
	fmt.Println(src)
}

//测试AES ECB 加密解密
func TestEncryptDecrypt() {
	key := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}
	blickSize := 16
	tool := NewAesTool(key, blickSize)
	encryptData, _ := tool.Encrypt([]byte("32334erew32"))
	fmt.Println(encryptData)
	decryptData, _ := tool.Decrypt(encryptData)
	fmt.Println(string(decryptData))
}

func main() {
	fmt.Println("Padding Test........")
	TestPadding()
	fmt.Println("AES ECB加密解密测试........")
	TestEncryptDecrypt()
}
时间: 2024-08-01 16:09:55

golang实现AES ECB模式的加密和解密的相关文章

ios-IOS易宝充值接口AES/ECB/PKCS5Padding算法加密问题

问题描述 IOS易宝充值接口AES/ECB/PKCS5Padding算法加密问题 有谁做过易宝IOS充值接口?现在我出现的问题是加密了,易宝那边解析不了,有人能帮我解决下么?高分补偿!! 补充一下是128位的不是256的加密 解决方案 我要的是IOS的..不是安卓的.... 解决方案二: 这种充值的sdk肯定有测试的例子吧,你按照示例来加密吧.通常肯定不会在这里出问题的. 解决方案三: 易宝那边是没有SDKdemo的.他是页面的,,安卓那边没有问题,现在IOS加密后,易宝解析不了...求原因 解

C# 实现 加密、解密使用AES算法的OFB模式(不填充,明文与密文长度一致)

问题描述 //默认密钥向量byte[]_key1={0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};//加密KEYbyte[]Key=Encoding.UTF8.GetBytes("12345678901234567890123456789012");//加密方法publicstaticbyte[]EncryptStringToBytes_Aes(byte[]plainTe

Php AES加密、解密与Java互操作的问题

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.  -------------------------------------------------------------------------

JAVA实现AES的加密和解密算法

原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 * 对原始数据进行AES加密后,在进行Base6

android使用AES加密和解密文件实例代码

前言 最近公司需要对本公司的一些下载文件进行加密解密需求,也就尝试去实现下,其实需要借助第三方的jar包:bcprov-jdk15on-155.jar,下载这个可以到网上搜或者下载本人的demo即可,注意:需要加密和解密的key是一致的才可以解密,不然就会解密失败.不多说,直接上代码. 效果图 代码: 实现加密解密逻辑代码 package com.vsoontech.p2p.sample; import java.io.IOException; import java.io.InputStrea

二进制-在c++里怎么用aes(openssl)实现通信加密?

问题描述 在c++里怎么用aes(openssl)实现通信加密? 我之前写了一个程序,就是在c++里使用aes(openssl)加密消息后,再通过socket传送,加密后的二进制数据,我就直接存到了字符串里发送了出去,然后到了另一端就解密失败了,报错是539,有趣的是,我把这个消息再原封不动的转发回进行加密的那个程序中后,就可以解密了.因为以前也没有写过加解密的程序,所以也不知道是不是哪个地方的想法有问题,求大神指点迷津啊!!!! 解决方案 openssl aes 加密aes加密------op

mcrypt启用 加密以及解密过程详细解析_php技巧

Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原. 1.PHP加密扩展库Mcrypt安装在标准的PHP安装过程中并没有把Mrcypt安装上,但PHP的主目录下包含了libmcrypt.dll和libmhash.dll文件 (libmhash.dll是Mhash扩展库,这里可以一起装上).首先,将这两个文件复制到系统目录windows\system32下,然后在 PHP.ini文件中按Ctrl+F快捷键跳出查找框,并找到:extension=php-mcrypt.dll和

xml的加密和解密

xml|加密|解密 xml加密(XML Encryption)是w3c加密xml的标准.这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留. 介绍我们有3个加密xml的方法 1.仅仅使用对称加密的方法加密xml这种加密方法只使用一个密钥,也就是说无论是加密xml还是解密xml都使用一个相同的密钥.因为这个密钥不会在被加密的xml中保存,所以我们需要在加密和解密的过程中加载这个密钥并保护它不被窃取. 2.使用对称加密和非对称加密相结合

MySQL字段加密和解密

MySQL字段加密和解密 1.加密:aes_encrypt('admin','key') 解密:aes_decrypt(password,'key') 2.双向加密 通过密钥去加密,解密的时候的只有知道这个密钥的人来解密 加密:encode() 解密:decode() eg:encode('123456' 'adfdgfdhggfh'); decode(password,'adfdgfdhggfh'); 3.PASSWORD('123456') password加密是不可逆转的 4.MD5('1