golang实现加密解密文档

golang实现加密解密文档

package mainimport ("bytes""crypto/aes""crypto/cipher""crypto/rand""encoding/base64""flag""fmt""io""io/ioutil"
)func main() {encodePtr := flag.String("e", "", "File to be encoded")decodePtr := flag.String("d", "", "File to be decoded")outputPtr := flag.String("o", "", "Output file")keyPtr := flag.String("k", "", "Decryption key")flag.Parse()if *encodePtr != "" {key := encryptFile(*encodePtr, *outputPtr)fmt.Println("Encryption key:", key)} else if *decodePtr != "" && *keyPtr != "" {decryptFile(*decodePtr, *keyPtr, *outputPtr)} else {flag.PrintDefaults()}
}func encryptFile(inputFile, outputFile string) string {plaintext, err := ioutil.ReadFile(inputFile)if err != nil {fmt.Println("Error reading input file:", err)return ""}key := make([]byte, 16)_, err = rand.Read(key)if err != nil {fmt.Println("Error generating random key:", err)return ""}block, err := aes.NewCipher(key)if err != nil {fmt.Println("Error creating AES cipher:", err)return ""}// Padding the plaintext to a multiple of the block sizepadding := aes.BlockSize - (len(plaintext) % aes.BlockSize)if padding > 0 {plaintext = append(plaintext, bytes.Repeat([]byte{byte(padding)}, padding)...)}ciphertext := make([]byte, aes.BlockSize+len(plaintext))iv := ciphertext[:aes.BlockSize]if _, err := io.ReadFull(rand.Reader, iv); err != nil {fmt.Println("Error generating IV:", err)return ""}mode := cipher.NewCBCEncrypter(block, iv)mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)encoded := base64.StdEncoding.EncodeToString(ciphertext)if outputFile != "" {err := ioutil.WriteFile(outputFile, []byte(encoded), 0644)if err != nil {fmt.Println("Error writing to output file:", err)return ""}}return base64.StdEncoding.EncodeToString(key)
}func decryptFile(inputFile, keyString, outputFile string) {ciphertext, err := ioutil.ReadFile(inputFile)if err != nil {fmt.Println("Error reading input file:", err)return}key, err := base64.StdEncoding.DecodeString(keyString)if err != nil {fmt.Println("Error decoding key:", err)return}block, err := aes.NewCipher(key)if err != nil {fmt.Println("Error creating AES cipher:", err)return}decoded, err := base64.StdEncoding.DecodeString(string(ciphertext))if err != nil {fmt.Println("Error decoding Base64:", err)return}if len(decoded) < aes.BlockSize {fmt.Println("Ciphertext too short")return}iv := decoded[:aes.BlockSize]decoded = decoded[aes.BlockSize:]if len(decoded)%aes.BlockSize != 0 {fmt.Println("Ciphertext is not a multiple of the block size")return}mode := cipher.NewCBCDecrypter(block, iv)mode.CryptBlocks(decoded, decoded)// Remove paddingpadding := decoded[len(decoded)-1]decoded = decoded[:len(decoded)-int(padding)]err = ioutil.WriteFile(outputFile, decoded, 0644)if err != nil {fmt.Println("Error writing to output file:", err)return}fmt.Println("Decryption successful. Decrypted content written to", outputFile)
}

实现效果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/40ef0f7fbafd45568910644eeb61d1d2.png
打包代码

go build -ldflags=" -s -w" -buildvcs=false follow-me.go 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/337813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 STM32 和 DS18B20 温度传感器设计室内温度监测与报警系统

为设计室内温度监测与报警系统&#xff0c;我们将利用STM32微控制器和DS18B20数字温度传感器&#xff0c;以及蜂鸣器实现温度报警功能。在本文中&#xff0c;将介绍如何通过STM32微控制器读取DS18B20传感器的温度数据&#xff0c;并在超出设定范围时触发蜂鸣器报警。 1. 系统概…

VMware 最新版 - 虚拟机安装、激活、Centos安装、XShell 连接虚拟机、网络配置(全流程)

目录 一、VMware 从安装到使用全流程 1.1、安装和激活 1.2、下载 Centos 镜像&#xff08;以 7 为例&#xff09; 1.3、创建虚拟机 1.4、网络配置 1.5、验证网络是否可用 一、VMware 从安装到使用全流程 1.1、安装和激活 a&#xff09;从以下地址下载虚拟机 以下链接来自…

小型内衣裤洗衣机哪个牌子好?市面上内衣洗衣机便宜好用的牌子推荐

这两年&#xff0c;内衣洗衣机这个小型的家电逐渐走进热门的视线里&#xff0c;很多小伙伴使用过它之后不仅轻松了很多&#xff0c;还可以很好的少数一些细菌。但这个时候也有人说内衣洗衣机就是智商税&#xff0c;根本没有作用&#xff0c;只能心理在作怪&#xff0c;而面对这…

计算数学表达式的程序(Java课程设计)

1. 课设团队介绍 团队名称 团队成 员介绍 任务分配 团队成员博客 XQ Warriors 徐维辉 负责计算器数据的算法操作&#xff0c;如平方数、加减乘除&#xff0c;显示历史计算记录 无 邱良厦&#xff08;组长&#xff09; 负责计算器的图形设计&#xff0c;把输入和结果显…

一文解决新手所有python环境变量报错问题

问题描述: cmd控制台输入python或pip后会出现下面情况 首先确保安装程序时勾选了安装pip pip的所在目录&#xff0c;可以打开该目录查看是否存在 如果还有问题&#xff0c;确保环境变量配置了python的路径 具体操作步骤 此处的用户环境变量是只针对当前系统用户有效&a…

渐进增强与优雅降级:提升用户体验的双重策略

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

CHS_01.2.1.1+2.1.3+进程的概念、组成、特征

CHS_01.2.1.12.1.3进程的概念、组成、特征 进程进程的概念 进程的组成——PCB进程的组成——PCB进程的组成——程序段、数据段知识滚雪球&#xff1a;程序是如何运行的&#xff1f;进程的组成进程的特征 知识回顾与重要考点 从这个小节开始 我们会正式进入第二章处理机管理相关…

Mysql是怎样运行的--下

文章目录 Mysql是怎样运行的--下查询优化explainoptimizer_trace InnoDB的Buffer Pool&#xff08;缓冲池&#xff09;Buffer Pool的存储结构空闲页存储--free链表脏页&#xff08;修改后的数据&#xff09;存储--flush链表 使用Buffer PoolLRU链表的管理 事务ACID事务的状态事…

C语言基础语法跟练 day2

题源&#xff1a;牛客网 16、BoBo写了一个十六进制整数ABCDEF&#xff0c;他问KiKi对应的十进制整数是多少。 #include <stdio.h>int main() { //创建变量char arr[] "ABCDEF";int i;int sum0,c; //依次转换十六进制为十进制for(i0; arr[i]!\0; i){char b …

python学习函数------廖雪峰的官方网站

文章目录 4.函数4.1调用函数abs(一个参数)函数&#xff1a;求绝对值的函数&#xff0c;只有一个参数。max(多个参数)函数&#xff1a;可以接收任意多个参数&#xff0c;并返回最大的那个数据类型转换hex()函数&#xff1a;把一个整数转换成十六进制表示的字符串 4.2定义函数4.3…

QT第三天

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面如果账号和密码不匹配&#xff0…

Ubuntu 实时查看显存调用命令 free 及命令详解与原理说明(全)

Ubuntu 实时查看显存调用命令 free 及详解 文章目录 Ubuntu 实时查看显存调用命令 free 及详解1 free 作用1.1 语法&#xff1a;1.2 单独显示例子1.3 组合显示例子 2 输出介绍3 原理解释3.1 buff / cache&#xff08;即 buffer / cache&#xff09;3.1.1 buffer 缓冲区3.1.2 ca…