Go 实现 AES 加密 CBC 模式|Go主题月

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 密码分组链接模式 CBC (Cipher Block Chaining),这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

网络异常,图片无法展示
|

什么是 CBC 模式?


密码分组链接模式 CBC (Cipher Block Chaining),这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

这时候就有个问题,那第一段的明文怎么加密呢?这时候就引入了初始化向量(英语:initialization vector,缩写为IV)。

初始化向量是随机的,就是你可以自定义这个初始化向量,不同的初始化向量加密出来的结果也不一样。

Go 实现


在 Go 中,我们可以用官方提供的 crypto/aes 标准库来给我们进行 AES 加密,不过这个库并没有给我们指定加密模式,需要我们自己通过 crypto/cipher 来选择加密模式。

AES CBC 模式加密

首先我们可以调用 crypto/aes 的函数来返回一个密码块

func NewCipher(key []byte) (cipher.Block, error)

NewCipher 创建并返回一个新的 cipher.Block。 key参数应为 16、24 或 32 个字节长度的 AES 密钥,以选择 AES-128,AES-192 或AES-256。

比如我们要选择 AES-128 进加密,这时候就可以这么写

key := "qwertyuiopasdfgh"
block,err:=aes.NewCipher([]byte(key))

当然,密钥 key 是自定义的,你可以更改你喜欢的密钥。

然后比如说我们要加密 oooooo灰灰 这个文本内容,首先就是对这个文本内容进行填充,这个需要我们自己实现,我们可以定义一个 PKCS7Padding 的填充方法,用 PKCS7Padding 填充模式进行填充内容。

PKCS7Padding填充模式:假设数据长度需要填充 n(n>0) 个字节才对齐,那么填充 n 个字节,每个字节都是 n 。如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小

/*
  PKCS7Padding 填充模式
  text:明文内容
  blockSize:分组块大小
*/
func PKCS7Padding(text []byte,blockSize int) []byte {
  // 计算待填充的长度
  padding := blockSize - len(text)%blockSize
  var paddingText []byte
  if padding == 0 {
    // 已对齐,填充一整块数据,每个数据为 blockSize
    paddingText = bytes.Repeat([]byte{byte(blockSize)},blockSize)
  }else {
    // 未对齐 填充 padding 个数据,每个数据为 padding
    paddingText = bytes.Repeat([]byte{byte(padding)},padding)
  }
  return append(text,paddingText...)
}

填充完后,我们就可以用 crypto/cipherNewCBCEncrypter 函数来得到一个 BlockMode ,然后用 BlockMode 来进行加密。具体代码如下:

/*
  CBC 加密
  text 待加密的明文
    key 秘钥
*/
func CBCEncrypter(text []byte,key []byte,iv []byte) []byte{
  block,err:=aes.NewCipher(key)
  if err !=nil {
    fmt.Println(err)
  }
  // 填充
  paddText := PKCS7Padding(text,block.BlockSize())
  blockMode := cipher.NewCBCEncrypter(block,iv)
  // 加密
  result := make([]byte,len(paddText))
  blockMode.CryptBlocks(result,paddText)
    // 返回密文
  return result
}

AES CBC 模式解密

解密的话 Go 官方标准库 crypto/cipher 为我们提供了 NewCBCDecrypter 函数,我们可以通过此函数来获得 BlockMode ,然后进行解密

/*
  CBC 解密
  encrypter 待解密的密文
  key 秘钥
*/
func CBCDecrypter(encrypter []byte,key []byte,iv []byte) []byte {
  block,err:=aes.NewCipher(key)
  if err !=nil {
    fmt.Println(err)
  }
  blockMode := cipher.NewCBCDecrypter(block,iv)
  result := make([]byte,len(encrypter))
  blockMode.CryptBlocks(result,encrypter)
  // 去除填充
  result = UnPKCS7Padding(result)
  return result
}

上面去除填充的 UnPKCS7Padding 函数,我们可以通过在末尾填充的数据来获取到底填充了多少长度的数据。因为 PKCS7Padding 填充数据的原理是假设数据长度需要填充 n(n>0) 个字节才对齐,那么填充 n 个字节,每个字节都是 n 。如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小

/*
  去除 PKCS7Padding 填充的数据
  text 待去除填充数据的原文
*/
func UnPKCS7Padding(text []byte) []byte{
  // 取出填充的数据 以此来获得填充数据长度
  unPadding := int(text[len(text)-1])
  return text[:(len(text)-unPadding)]
}

完整代码

完整代码可以点击此此处查看

总结


尽管 CBC 模式是 ECB 的改良版,但是它还是有一个 bug,问题出在初始变量 iv 上,这个下次在说。

目录
相关文章
|
12天前
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
143 43
|
8天前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
25 8
|
10天前
|
安全 算法 数据安全/隐私保护
深度揭秘!Python加密技术的背后,AES与RSA如何守护你的数据安全
【9月更文挑战第10天】随着数字化时代的到来,数据安全成为企业和个人面临的重大挑战。Python 作为功能强大的编程语言,在数据加密领域扮演着重要角色。AES 和 RSA 是两种主流加密算法,分别以对称和非对称加密方式保障数据安全。AES(Advanced Encryption Standard)因其高效性和安全性,在数据加密中广泛应用;而 RSA 则利用公钥和私钥机制,在密钥交换和数字签名方面表现卓越。
28 3
|
9天前
|
存储 安全 数据库
双重防护,无懈可击!Python AES+RSA加密方案,构建最强数据安全堡垒
【9月更文挑战第11天】在数字时代,数据安全至关重要。AES与RSA加密技术相结合,构成了一道坚固防线。AES以其高效性保障数据加密,而RSA则确保密钥安全传输,二者相辅相成,提供双重保护。本文通过Python代码示例展示了这一加密方案的魅力,强调了其在实际应用中的重要性和安全性。使用HTTPS等安全协议传输加密密钥和密文,确保数据在数字世界中自由流通而无忧。
20 1
|
2天前
|
安全 算法 数据安全/隐私保护
黑客克星!Python加密艺术大公开,AES、RSA双剑合璧,守护你的数字世界
在这个数据泛滥的时代,数字世界既充满了知识,也潜藏安全隐患。Python 作为强大的编程语言,以其独特的加密技术为我们的信息安全保驾护航。本文将介绍 AES 和 RSA 这两种加密算法,揭示它们如何协同工作,保护你的数字世界。AES(高级加密标准)以其高效、安全著称,能将敏感信息转化为难以破解的乱码。Python 的 `pycryptodome` 库让 AES 加密变得简单易行。然而,AES 面临密钥分发难题,此时 RSA(非对称加密算法)便大显身手,通过公钥加密、私钥解密的方式确保密钥传输安全。AES 与 RSA 在 Python 中交织成一道坚不可摧的防护网,共同守护我们的数字世界。
15 0
|
3天前
|
SQL 安全 算法
网络安全的盾牌与矛:加密技术与安全意识的双重防线
【9月更文挑战第16天】在数字世界的海洋中,网络安全的灯塔照亮着信息流通的每一个角落。本文将深入探讨网络安全的核心——加密技术,以及构筑坚不可摧防线的另一块基石——安全意识。我们将从密码学的基础知识出发,逐步揭开加密技术的神秘面纱,并分析当前最常见的网络攻击手段,揭示安全意识的重要性。通过理论与实践的结合,旨在为读者提供一套实用的网络安全知识体系,以应对日益复杂的网络威胁。
|
2天前
|
存储 安全 网络安全
网络安全与信息安全:构建安全防线的多维策略在当今数字化时代,网络安全已成为维护个人隐私、企业机密和国家安全的关键要素。本文旨在探讨网络安全漏洞的本质、加密技术的重要性以及提升公众安全意识的必要性,以期为构建更加坚固的网络环境提供参考。
本文聚焦于网络安全领域的核心议题,包括网络安全漏洞的现状与应对、加密技术的发展与应用,以及安全意识的培养与实践。通过分析真实案例,揭示网络安全威胁的多样性与复杂性,强调综合防护策略的重要性。不同于传统摘要,本文将直接深入核心内容,以简洁明了的方式概述各章节要点,旨在迅速吸引读者兴趣,引导其进一步探索全文。
|
2天前
|
SQL 安全 算法
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第18天】随着互联网的发展,网络安全问题日益严重。本文将从网络安全漏洞、加密技术、安全意识等方面进行知识分享,帮助读者了解网络安全的重要性和应对策略。通过本文,您将了解到如何保护自己的网络安全,提高安全意识,防范网络攻击。
|
1天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第18天】在当今数字化时代,网络安全与信息安全已成为我们生活中不可或缺的一部分。本文将探讨网络安全漏洞、加密技术以及安全意识等方面的内容,以帮助读者更好地了解和保护自己的网络安全。我们将通过实例分析,深入探讨网络安全的重要性,并提供一些实用的技巧和建议。
|
2天前
|
监控 安全 网络安全
网络安全的盾与剑:漏洞防御与加密技术解析
【9月更文挑战第17天】在数字时代的浪潮中,网络安全成为保护数据和隐私的关键防线。本文深入浅出地探讨了网络安全的两大支柱:漏洞防御和加密技术,旨在提升公众的安全意识并分享防护策略。我们将从基础概念出发,逐步深入到技术细节,不仅阐释原理,还提供实际案例分析,帮助读者构建起一道坚固的数字防御墙。
17 3