Go语言与3重DES加密算法 —— 3DES加密算法概念、实现原理、实例

3DES加密算法原理及实现 目录 引语 加密 加密算法公式 为什么采用加密-解密-加密的形式 解密 代码实现 注意:3DES是3重DES加解密算法,具体原理同DES,不在赘述。 引语 DES算法是全网公开的,其安全性是依靠秘钥的,但是随着计算机算力的增长,56位的秘钥容易受到穷举攻击。因此,3DES作为替换升级的方案应运而生。 加密 3DES是对称加密的一种,是DES向AES过渡的加密算法。它使用三个秘钥的三重DES加密方法,该算法执行三次DES算法,其加密的过程是加密-解密-加密。 3DES加密流程 . 阅读详情

 

3DES

三重DES是为了增强DES的强度,将DES重复3次所得到的一种密码算法

3DES加密机制:

 

说明:

  1. 明文经过三次DES处理才变成最后的密文,由于DES密钥的长度实质上是56比特,因此三重DES的密钥长度就是56*3=168比特。
  2. 三重DES并不是进行三次加密(加密->加密->加密),而是加密->解密->加密的过程,这种设计是为了让3des能够兼容普通的des,当三重des密钥全部相同时,3重des就xi相当与普通的des,这是因为在前两轮加密->解密之后,得到的就是最初的明文,因此以前的des加密的密文,也就可以通过这种方式用三重des来进行解密。

三重DES解密机制:

1.简单明文处理 

  1. 首先定义一个加密函数,实现将明文通过24个字节数的key进行加密得到一个密文
  2. 通过key并利用
    des.NewTripleDESCipher(key)
    得到一个block接口
  3. 将明文进行填充处理,获得其长度是block.size()的倍数,这样才可以进行密文组明文组加密处理
  4. 通过
    iv := key[:block.BlockSize()]
    //创建CBC加密模式
    blockMode := cipher.NewCBCEncrypter(block, iv)
    dst := make([]byte, len(src))
    //加密
    blockMode.CryptBlocks(dst, src)
  5. 将其dst返回

 

package main

import (
	"crypto/des"
	"密码学/utils"
	"crypto/cipher"
	"fmt"
	"encoding/hex"
)

//3des加密
//src:待加密的明文   key:密钥
//返回值:加密之后的密文
func Encrypt3DES(src, key[]byte) []byte {
	//创建加密块
	block, err := des.NewTripleDESCipher(key)
	if err != nil {
		panic(err)
	}
	length := block.BlockSize()
	//填充最后一组数据
	src = utils.PaddingText(src, length)
	//初始化向量
	iv := key[:block.BlockSize()]
	//创建CBC加密模式
	blockMode := cipher.NewCBCEncrypter(block, iv)
	dst := make([]byte, len(src))
	//加密
	blockMode.CryptBlocks(dst, src)
	return dst
}

//3des解密
//src:待解密的密文  key:密钥,和加密时使用的密钥相同
//返回值:解密之后的明文
func Decrypt3DES(src, key []byte) []byte {
	//创建解密的块
	block, err := des.NewTripleDESCipher(key)
	if err != nil {
		panic(err)
	}
	//创建CBC解密模式
	blockMode := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])
	dst := make([]byte, len(src))
	//解密
	blockMode.CryptBlocks(dst, src)
	//去除尾部填充数据
	dst = utils.UnPaddingText(dst)
	return dst
}

func main() {
	key := []byte("1234567887654321aabbccdd")
	data := []byte("WEK")
	encrypt_msg := Encrypt3DES(data, key)
	fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))
	decrypt_msg := Decrypt3DES(encrypt_msg, key)
	fmt.Println("decrypt_msg = ", string(decrypt_msg))
}

 

2.将文件进行3重DES加密

读取文件,将文件内容以[]byte格式取出,这样就可以进行3重DES加密,然后再将其保存成一个文件就可以

 

package main

import (
	"crypto/des"
	"crypto/cipher"
	"密码学/utils"
	"fmt"
	"bytes"
	"io/ioutil"
	"strings"
)

const KEY_SIZE  = 24

//3des加密
//src:待加密的明文   key:密钥
//返回值:加密之后的密文
func Encrypt3(src, key[]byte) []byte {
	//创建加密块
	block, err := des.NewTripleDESCipher(key)
	if err != nil {
		panic(err)
	}
	length := block.BlockSize()
	//填充最后一组数据
	src = utils.PaddingText(src, length)
	//初始化向量
	iv := key[:block.BlockSize()]
	//创建CBC加密模式
	blockMode := cipher.NewCBCEncrypter(block, iv)
	dst := make([]byte, len(src))
	//加密
	blockMode.CryptBlocks(dst, src)
	return dst
}

//3des解密
//src:待解密的密文  key:密钥,和加密时使用的密钥相同
//返回值:解密之后的明文
func Decrypt3(src, key []byte) []byte {
	//创建解密的块
	block, err := des.NewTripleDESCipher(key)
	if err != nil {
		panic(err)
	}
	//创建CBC解密模式
	blockMode := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])
	dst := make([]byte, len(src))
	//解密
	blockMode.CryptBlocks(dst, src)
	//去除尾部填充数据
	dst = utils.UnPaddingText(dst)
	return dst
}

//对用户输入的密钥进行梳理,如果用户输入的密钥太长,
//截取密钥前24字节,如果用户输入的密钥太短,
func genKey(key []byte) []byte {
	//创建切片,用于存储最终的密钥
	kkey := make([]byte, 0, KEY_SIZE)
	length := len(key)
	//密钥长度大于24字节
	if length > KEY_SIZE {
		kkey = append(kkey, key[:KEY_SIZE]...)
	}else {
		div := KEY_SIZE / length
		mod := KEY_SIZE % length
		for i := 0; i < div; i++ {
			kkey = append(kkey, key...)
		}
		kkey = append(kkey, key[:mod]...)
	}
	return kkey
}

func main() {
	//命令
	var command string
	//文件名称
	var filename string
	fmt.Print("请输入命令(加密|解密):")
	fmt.Scanln(&command)
	if command == "加密" {
		fmt.Print("请输入需要被加密的文件的名称:")
		fmt.Scanln(&filename)
		var password string
		fmt.Println("请输入密钥:")
		fmt.Scanln(&password)
		var confirmpassword string
		fmt.Print("请输入确认密钥:")
		fmt.Scanln(&confirmpassword)
		if !bytes.Equal([]byte(password), []byte(confirmpassword)) {
			fmt.Println("两次输入的密钥不匹配,请重新输入!")
		}else {
			//处理用户输入的密钥
			key := genKey([]byte(password))
			//读取文件
			info, _ := ioutil.ReadFile(filename)
			//对文件加密
			dst := Encrypt3(info, key)
			//  1.avi  1_encrypted.avi
			//获取点的下标
			index := strings.LastIndex(filename, ".")
			//创建新的文件名称
			newfilename := filename[:index] + "_encrypted" + filename[index:]
			//写入文件
			ioutil.WriteFile(newfilename, dst, 0666)
			fmt.Println("已生成加密文件:" + newfilename)
		}
	}else if command == "解密" {
		fmt.Print("请输入文件名称:")
		fmt.Scanln(&filename)
		var password string
		fmt.Print("请输入密钥:")
		fmt.Scanln(&password)
		key := genKey([]byte(password))
		info, _ := ioutil.ReadFile(filename)
		src := Decrypt3(info, key)
		index := strings.LastIndex(filename, ".")
		newfilename := filename[:index] + "_decrypted" + filename[index:]
		ioutil.WriteFile(newfilename, src, 0666)
		fmt.Println("已生成解密文件:"+newfilename)
	}
}

 

3DES数据加密算法 3DES数据加密算法是一种可逆的对称加密算法,也称三重数据加密算法(英语:Triple Data Encryption Algorithm,缩写为TDEA,Triple DEA),或称3DES(Triple DES),它是一种为了替代原先DES而建立的数据加密标准。 阅读详情

相关推荐

深入理解3DES算法

3DES(Triple DES)是一种基于DES(Data Encryption Standard)的对称加密算法,它使用三个不同的密钥对数据进行三次加密,从而提供了更高的安全性。3DES的名字来源于它使用的三个56位的密钥,这三个密钥分别是:密钥1(K1)、密钥2(K2)和密钥3(K3)。

LWJLWJ_的博客 2113

3DES加密算法

一、3DES加密 DES是一个经典的对称加密算法,但也缺陷明显,即56位的密钥安全性不足,已被证实可以在短时间内破解。为解决此问题,出现了3DES,也称Triple DES,3DES为DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。为了兼容普通的DES,3DES并没有直接使用 加密-&gt;加密-&gt;加密 的方式,而是采用了加密-&gt;解密-&gt;加密 的方式。 ...

码墨 3576

Go语言实现三重DES加密算法(CBC模式)

Go语言实现三重DES算法(CBC模式) 由于DES已经可以被暴力破解了,三重DES就是为了增加DES的强度,实现原理就是将DES重复三次,通常缩写为3DES。3DES的密钥长度为8byte*3=24byte。 3DES的加密机制为:加密-&amp;amp;gt;解密-&amp;amp;gt;加密 3DES的解密机制为:解密-&amp;amp;gt;加密-&amp;amp;gt;解密 CBC模式(密码分组链接模式)是常用的一种分组密码的模式。(点击查看分组密码...

xing的博客 1837

GO的DES/3DES加密算法的实现及通信透彻解析

GO的DES/3DES加密算法的实现及通信透彻解析前位语:前景提要:一、DES介绍MODE: ECBMODE: CBC使用方法DES二、3DES加密原理使用方法3DES注意点:三、多语言通信 前位语: 各位老铁万福金安,相信各位之所以找到这篇文章,肯定是因为项目遇到了关于des/des3的相关问题.不要着急,建议耐下性子花上半个小时,理解完本篇文章,你的问题将迎刃而解. 前景提要: 最近因工作需要,接触到des加密算法; 但是因为des加密容易被暴力破解,所以项目中用到的是3des加密算法,也就是des三

银角大王 1630

Go语言实现对称加密DES,3DES和AES算法

package main import ( "bytes" aes2 "crypto/aes" "crypto/cipher" "crypto/des" ) //填充最后一个分组的函数 //src 原始数据 //blockSize 每个分组的数据长度 func paddingText(src []byte, blockSize int) []byte { //1...

萌猫芭乐主人的博客 459

K-means在关键词聚类中的尝试

K-means在文本聚类中的尝试 K-means算法是无监督的聚类算法。它的算法思想是:先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。 K-means算法的关键点在于: 初始k个聚类中心的选择 距离的计...

BigPig_LittleTail的博客 5573

Go语言实现对称加密算法AES、DES、3DES和非对称加密算法RSA

使用GO语言实现对称加密与非对称加密算法

面向生活编程 3137

手把手教你搞定Pattern Recognition Letters的LaTeX投稿(附elsarticle.cls生成避坑指南)

本文详细指导如何在Pattern Recognition Letters(PRL)期刊上使用LaTeX进行投稿,特别针对elsarticle.cls文件的生成与常见问题提供避坑指南。从模板准备、文件上传到投稿后的验证,系统梳理全流程技术要点,帮助研究者高效完成学术论文投稿。

weixin_33824385的博客 430

Go语言实现对称加密算法AES、DES、3DES和非对称加密算法RSA_golang 对称加密算法

block, errBlock := des.NewTripleDESCipher(tdesKey) // 和des的区别。block, err := des.NewTripleDESCipher(tdesKey) // 和des的区别。(img-5gTbUpXk-1726042606246)]// 3des的key,长度是24。// 保存生成的公钥和密钥。// 只支持8字节的长度。// 读取内容到容器里面。// base64编码。// base64编码。// 去掉填充的部分。

2401_86963632的博客 1135

【迁移学习综述】

迁移学习的目标是将某个领域或任务上学习到的知识应用到不同的但相关的领域或问题中。迁移学习的研究来源于一个观测:人类可以将以前的学到的知识应用于解决新的问题,更快的解决问题或取得更好的效果。迁移学习被赋予这样一个任务:从以前的任务当中去学习知识(knowledge)或经验,并应用于新的任务当中。换句话说,迁移学习目的是从一个或多个源任务(source tasks)中抽取知识、经验,然后应用于一个目标领域(target domain)当中去。

afadgas的博客 4319

Cadence 设计实践笔记-小哥allegro 2层板笔记

规范建立文件夹本章节主要跟着B站PCB入门首选视频-小哥Cadence Allegro 2层板视频,结合自己的实践一步步完成一个完整的PCB板的设计。规范建立文件夹建立八个文件夹我使用的Cadence 17.4 有些差异原理图绘制原图绘制首先要熟悉原理图工作原理工作原理下面是这个项目的原理图重点关注电源新建原理图库打开Cadence 软件创建项目新建工程 File ==========》Project我这里选择了Enable PSPice 试试能不能仿真,新建项目如下。

我的专栏 1479

使用GO语言实现对称加密,DES、3DES、AES

使用GO语言实现对称加密,DES、3DES、AES测试程序 package main import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/des" ) // 填充最后一个分组的函数 // src - 原始数据 // blockSize - 每个分组的数据长度 func padding(src []byte, blockSize i...

July_whj 1144

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 离线蒸馏(附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv8的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了!欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 4322

go语言对称加密使用(DES、3DES、AES)

golang对称加密、解密,DES、3DES、AES

咸甜适中 2480

uniapp [全端兼容] - 详细实现引入使用 Google 谷歌地图显示及搜索城市地点,提供地图标点、地址搜索、定位导航、中文显示及汉化、地图打位置标点显示、搜索框搜索功能、省市区详细经纬度数据等

uniapp,h5移动端网页,微信小程序,Android,苹果ios,app,nvue,谷歌地图,官方,谷歌官方文档,googlemap,申请key,uniApp谷歌地图,详细使用教程,无法访问,集成谷歌地图,app引入谷歌地图,选点定位,地图导航,位置搜索,城市搜索,文字地点模糊查询,地点省市区详细数据,经纬度信息,markers地图标记点,一直报错怎么办,接入google地图不显示报错,谷歌地图插件,vue3,vue2,组件,Key申请流程,谷歌key怎么申请,api文档,网站打不开,用什么插件,在u

🏆 前端领域优质创作者 1万+

Altium Designer应用技巧5: Altium Live账号的获得

为了更好的应用Altium Designer,我们需要得到一个Altium Live账号,但从其英文或者中文官方网站取得,都需要7个工作日的时间,而且对于个人用户来说,并不是100%都能够获取到。本文介绍一种,从俄罗斯Altium官方网站获取账号的方法,可以立即使用。     1、点击http://live.altium-ru.com/#Join网址进入俄罗斯Altium官方网站,Altiu

snmplink的博客 1万+

Go语言中DES与3DES加密原理、实战与遗留系统对接指南

对称加密是信息安全领域的基石技术,其核心原理是通过同一密钥完成数据的加密与解密,确保传输和存储的机密性。DES(数据加密标准)作为早期广泛采用的分组密码算法,基于Feistel网络结构,通过多轮置换和代换实现混淆与扩散,但其56位密钥长度在算力提升下已显不足。为此衍生的3DES通过三次DES操作提升有效密钥长度至168位,显著增强了安全性,代价是加密速度下降。在工程实践中,分组密码需结合CBC等工作模式与PKCS#7等填充方案,才能处理任意长度数据。尽管AES已成为现代应用首选,但在金融、通信等传统行业的遗

weixin_34199405的博客 1017

【天气雷达】双偏振产品-差分反射率ZDR详解

双偏振产品-差分反射率ZDR详解。

珞瑜的博客 5407

Go-Des和3Des算法详解与代码_go des(1)

下面是PC-1,注意,不包括8,16,24,32,40,48,56和64,前面提到,这些是校验位。

2401_84970385的博客 676

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Go语言实现DES与3DES算法:从原理到实战详解

对称加密是信息安全领域的基石技术,它使用相同密钥进行加密和解密,保障数据传输的机密性。其核心原理基于置换、代换和迭代操作,通过混淆和扩散机制确保安全。在工程实践中,DES(数据加密标准)作为经典的分组密码算法,采用Feistel网络结构,通过S盒实现非线性变换,是理解现代加密技术的重要基础。尽管AES已成为主流标准,但DES和3DES在遗留系统维护、金融交易等场景中仍有应用价值。本文以Go语言为例,详细解析DES算法的位操作实现、Feistel网络构建以及3DES的加固策略,涵盖子密钥生成、S盒代换等关键环

weixin_33783283的博客 302

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

go语言实现三重DES加密算法(附带源码)

go语言实现三重DES加密算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 954

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Go语言 Go加密之DES

接着RSA加密解密,我们继续来看看DES的加密解密 一、DES简介 DES(Data Encryption Standard)是对称加密算法,也就是加密和解密用相同的密钥。其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,

Sunface撩技术 5414

<golang>常用对称加密DES、3DES具体实现

版权声明:本文为作者原创,如需转载,请注明出处 https://blog.youkuaiyun.com/weixin_42940826 注:对称加密算法需要用分组模式的知识,在我上一篇帖子里有介绍对称加密算法常用的五种分组模式(ECB/CBC/CFB/OFB/CTR) DES简介和实现 DES – Data Encryption Standard (已经被破解不再使用,但是很有研究价值,而且诞生...

weixin_42940826的博客 2072

DES、3DES加密算法

DES加密算法,为对称加密算法中的一种。70年代初由IBM研发,后1977年被美国国家标准局采纳为数据加密标准,即DES全称的由来:Data Encryption Standard。对称加密算法,是相对于非对称加密算法而言的。两者区别在于,对称加密在加密和解密时使用同一密钥,而非对称加密在加密和解密时使用不同的密钥,即公钥和私钥。常见的DES、3DES、AES均为对称加密算法,而RSA、椭圆曲线加...

象牙塔下的渣渣 3万+
上一篇: Go语言实现DES加密算法(二)—— DES的ECB模式、CFB模式、OFB模式原理简介
下一篇: GO语言与RSA算法 —— RSA算法概念、原理、Go语言实现实例
The_Reader
博客等级 码龄10年 74粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值