热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【go密码学】对称加密算法

对称加密对称加密算法是相对于非对称加密算法而言,两者的区别在于,对称加密和加密和解密时使用相同的秘钥,而非对称加密在加密和解密时使用不同的秘钥(公钥和私钥)。常见的对称加密算法:D
对称加密

对称加密算法是相对于非对称加密算法而言,两者的区别在于,对称加密和加密和解密时使用相同的秘钥,而非对称加密在加密和解密时使用不同的秘钥(公钥和私钥)。常见的对称加密算法:DES3DESAES

DES

DES的基础结构,由IBM公司的Horst Feistel设计,因此称Feistel网络。在Feistel网络中,加密的每个步骤称为轮,经过初始置换后的64位明文,进行了16轮Feistel轮的加密过程,最后经过终结置换后形成最终的64位密文,如下图:

《【go密码学】-对称加密算法》

go实现DES

package main
import (
"bytes"
"fmt"
"crypto/des"
"crypto/cipher"
"encoding/base64"
)
//利用秘钥通过DES算法实现明文的加密
//利用秘钥通过DES算法实现密文的解密
//在加密和解密之前,首先需要补码和去码的操作
//补码
func PKCS5Padding(orgData []byte, blockSize int) [] byte {
//abc55555
padding := blockSize - len(orgData)%8
padtxt := bytes.Repeat([]byte{byte(padding)}, padding)
return append(orgData, padtxt...)
}
//去码
func PKCS5UnPadding(cipherTxt []byte) []byte {
length := len(cipherTxt)
unpadding := int(cipherTxt[length-1])
return cipherTxt[:length-unpadding]
//cipherTxt[:4]
}
//DES加密,加密会用到补码
func DesEncrypt(orig []byte, key []byte) []byte {
//首先检验秘钥是否合法
//DES加密算法,秘钥的长度必须为8bit block.BlockSize() = 8;
block, _ := des.NewCipher(key)
//补码
origData := PKCS5Padding(orig, block.BlockSize())
//设置加密方式
blockMode := cipher.NewCBCEncrypter(block, key)
//加密处理
crypted := make([]byte, len(origData)) //存放加密后的密文
blockMode.CryptBlocks(crypted, origData)
return crypted
}
//DES解密,解密要用到去码
func DesDecrypt(cipherTxt []byte, key []byte) [] byte {
//校验key的有效性
block, _ := des.NewCipher(key)
//设置解码方式
blockMode := cipher.NewCBCDecrypter(block, key)
//创建缓冲,存放解密后的数据
orgData := make([]byte, len(cipherTxt))
//开始解密
blockMode.CryptBlocks(orgData, cipherTxt)
//去掉编码
orgData = PKCS5UnPadding(orgData)
return orgData
}
func main() {
//pad:=PKCS5Padding([]byte("abcd"),8)
//fmt.Println(pad)
var cipherTxt = DesEncrypt([]byte("kongyixueyuan"), []byte("12345678"))
fmt.Println(cipherTxt)
//通过base64处理秘文
fmt.Println(base64.StdEncoding.EncodeToString(cipherTxt))
//解码
var plainText = DesDecrypt(cipherTxt, []byte("12345678"))
fmt.Println(string(plainText))
//对称加密中,加密与解密是互逆的
//DES加密中秘钥长度必须为8字节,3DES秘钥长度必须为24,AES加密算法中秘钥长度必须为16或24或32字节
}

  • DES加密中秘钥长度必须为8字节
  • 在加密前需要补码操作(比如abc加密前,补码到8位:abc55555)
  • 在解密后需要去码操作

3DES

DES的56位的秘钥安全性不足,已被证实可以在短时间破解,为解决此问题,出现了3DES。3DES为DES向AES过渡的加密算法,它使用3条56位的秘钥对数据进行3次加密。为兼容普通的DES,3DES并没有直接使用加密->加密->加密的方式。

加密

《【go密码学】-对称加密算法》

当三重秘钥均相同时,前两步相互抵消,相当于仅实现了一次加密,因此可以实现对普通DES加密算法的兼容。

《【go密码学】-对称加密算法》

解密

与加密过程相反,是以秘钥3、秘钥2、秘钥1的顺序执行解密->加密->解密

AES

3DES因秘钥长度变长,安全性提升,但处理速度不高。因此又出现了AES加密算法。AES比3DES速度更快,安全性更高。
AES全称Advanced Encryption Standard,即:高级加密标准。AES加密算法中秘钥长度必须为16或24或32字节

go实现aes

package main
import (
"crypto/aes"
"crypto/cipher"
"bytes"
"fmt"
"encoding/base64"
)
//PKCS5的分组是以8为单位
//PKCS7的分组长度为1-255
func PKCS7Padding(org []byte, blockSize int) []byte {
pad := blockSize - len(org)%blockSize
padArr := bytes.Repeat([]byte{byte(pad)}, pad)
return append(org, padArr...)
}
//通过AES方式解密密文
func PKCS7UnPadding(org []byte) []byte {
//abcd4444
l := len(org)
pad := org[l-1]
//org[0:4]
return org[:l-int(pad)]
}
func AESDecrypt(cipherTxt []byte, key []byte) []byte {
block, _ := aes.NewCipher(key)
blockMode := cipher.NewCBCDecrypter(block, key)
//创建明文缓存
org := make([]byte, len(cipherTxt))
//开始解密
blockMode.CryptBlocks(org, cipherTxt)
//去码
org = PKCS7UnPadding(org)
//返回明文
return org
}
//AES加密
func AESEncrypt(org []byte, key [] byte) []byte {
//检验秘钥
block, _ := aes.NewCipher(key)
//对明文进行补码
org = PKCS7Padding(org, block.BlockSize())
//设置加密模式
blockMode := cipher.NewCBCEncrypter(block, key)
//创建密文缓冲区
cryted := make([]byte, len(org))
//加密
blockMode.CryptBlocks(cryted, org)
//返回密文
return cryted
}
func main() {
var Encode = AESEncrypt([]byte("kongyixueyuan"), []byte("1234567890123456"))
fmt.Println(base64.StdEncoding.EncodeToString(Encode))
fmt.Println("名文为:", string(AESDecrypt([]byte(Encode), []byte("1234567890123456"))))
}
分组模式

  • ECB:Electronic CodeBook mode (电子密码模式)
  • CBC:Cipher Block Chaining mode(密码分组链接模式)
  • CFB:Cipher FeedBack mode (密文反馈模式)
  • OFB:Output FeedBack mode (输出反馈模式)
  • CTR:CounTeR mode (计数器模式)

ECB

  • ECB模式是所有模式中最简单的一种。ECB的明文分组和密文分组是一一对应关系,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都会转换成相同的密文分组。这样一来,只要观察一下密文,就可以知道明文中存在怎样的重复组合,并可以以此为线索来破译密码,因此ECB模式是存在风险的。

《【go密码学】-对称加密算法》

《【go密码学】-对称加密算法》

CBC

  • 明文分组在加密之前一定会与“前一个密文分组”进行XOR运算,因此即便明文分组1和2的值是相等的,密文分组1和2也不一定相等,这样ECB模式的缺陷在CBC模式中就不存在了。
  • 在CBC模式中,无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3,则至少需要凑齐分组1、2、3才行。
  • 如果密文分组中有一些比特缺失了,即便只缺失了1比特,那么缺失比特的位置之后的密文分组也就全部无法解密了。

《【go密码学】-对称加密算法》

《【go密码学】-对称加密算法》

在上述的机密代码中,采用的就是CBC模式加密。

blockMode := cipher.NewCBCEncrypter(block, key)

推荐阅读
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文深入探讨了Memcached的内存管理机制,特别是其采用的Slab Allocator技术。该技术通过预分配不同大小的内存块来有效解决内存碎片问题,并确保高效的数据存储与检索。文中详细描述了Slab Allocator的工作原理、内存分配流程以及相关的优化策略。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • PostgreSQL 最新动态 —— 2022年4月6日
    了解 PostgreSQL 社区的最新进展和技术分享 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
author-avatar
裴潇艳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有