当前位置: 首页 > news >正文

go使用aes加密算法

工具代码

package toolimport ("bytes""crypto/aes""crypto/cipher"
)// AES加密函数
var key []byte = []byte("0@#3456789ABCDEF") //todo 记住这个长度只能是16 24 32  如果不是的话话会报错
func Encrypt(data []byte) ([]byte, error) {block, err := aes.NewCipher(key)if err != nil {return nil, err}// 填充明文字节数组paddingLen := aes.BlockSize - (len(data) % aes.BlockSize)paddedData := append(data, bytes.Repeat([]byte{byte(paddingLen)}, paddingLen)...)// 执行加密操作encrypted := make([]byte, len(paddedData))iv := make([]byte, aes.BlockSize) // 初始化向量,通常为全零mode := cipher.NewCBCEncrypter(block, iv)mode.CryptBlocks(encrypted, paddedData)return encrypted, nil
}// AES解密函数
func Decrypt(encryptedData []byte) ([]byte, error) {block, err := aes.NewCipher(key)if err != nil {return nil, err}// 执行解密操作decrypted := make([]byte, len(encryptedData))iv := make([]byte, aes.BlockSize) // 初始化向量,通常为全零mode := cipher.NewCBCDecrypter(block, iv)mode.CryptBlocks(decrypted, encryptedData)// 去除填充字节paddingLen := int(decrypted[len(decrypted)-1])decrypted = decrypted[:len(decrypted)-paddingLen]return decrypted, nil
}// 计算加密后的字节数组长度
func CalculateEncryptedLength(dataLen int) int {paddingLen := aes.BlockSize - (dataLen % aes.BlockSize)encryptedLen := dataLen + paddingLenreturn encryptedLen
}

测试类

package test
import ("beego_test/tool""testing"
)
// todo 字节解密和解密测试
func Test_encryption(t *testing.T) {originalBytes := []byte{115, 91, 212, 128, 220, 50, 0, 247, 207, 91, 178, 183, 207, 59, 115, 91}encryptedBytes, err := tool.Encrypt(originalBytes)if err != nil {log.Fatal(err)}d, err := tool.Decrypt(encryptedBytes)fmt.Println("原始的字节为", originalBytes)fmt.Println("加密后的字节为", encryptedBytes)fmt.Println("加密后的字节的长度为", len(encryptedBytes))fmt.Println("字节49加密后的长度", tool.CalculateEncryptedLength(49))fmt.Println("解密后的字节为", d)fmt.Println("无法根据密文长度推出原文长度")fmt.Println("可以根据密文退出原文")fmt.Println("可以根据原文长度推出密文长度")fmt.Println("如果字节无法解密会报错")tool.Decrypt(originalBytes)
}

相关文章:

  • 详细学习Pyqt5的20种输入控件(Input Widgets)
  • Docker下安装Redis
  • STM32 ADC转换器、串口输出
  • 城市安全守护者:分析无人机在交通领域的应用
  • LaTeX插入裁剪后的pdf图像
  • Echarts大屏可视化_05 折线图的定制开发
  • C语言——深入理解指针(4)
  • apk和小程序渗透测试
  • SQL server 2016安装
  • golang 实现单向链表(lru)、双向链表、双向循环链表
  • 简化控制台日志的输出内容
  • Nacos源码解读03——管理元数据
  • Android : SQLite 增删改查—简单应用
  • 人工智能时代:AIGC的横空出世
  • 二叉树OJ题目——C语言
  • SegmentFault for Android 3.0 发布
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • express如何解决request entity too large问题
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • MobX
  • MySQL用户中的%到底包不包括localhost?
  • PHP 小技巧
  • React Native移动开发实战-3-实现页面间的数据传递
  • redis学习笔记(三):列表、集合、有序集合
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • TCP拥塞控制
  • 百度地图API标注+时间轴组件
  • 基于web的全景—— Pannellum小试
  • 前端知识点整理(待续)
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 强力优化Rancher k8s中国区的使用体验
  • 少走弯路,给Java 1~5 年程序员的建议
  • 思考 CSS 架构
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 王永庆:技术创新改变教育未来
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #HarmonyOS:Web组件的使用
  • $.each()与$(selector).each()
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • . NET自动找可写目录
  • .net core 依赖注入的基本用发
  • .Net 高效开发之不可错过的实用工具
  • .net 后台导出excel ,word