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 上,这个下次在说。

目录
相关文章
|
28天前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
48 1
|
16天前
|
算法 安全 Go
RSA加密算法详解与Python和Go实现
RSA加密算法详解与Python和Go实现
34 1
|
1月前
|
数据安全/隐私保护
aes之ecb模式的加密解密
aes之ecb模式的加密解密
|
16天前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
46 0
|
10天前
|
SQL 安全 算法
网络安全的盾牌与剑:深入理解网络漏洞、加密技术及安全意识
【10月更文挑战第7天】在数字化时代的浪潮中,网络安全成了保护个人隐私和企业资产的关键防线。本文旨在揭示网络安全的重要性,并从网络漏洞识别、加密技术的运用到培养良好的安全意识等方面提供深入浅出的知识分享。通过实例分析,我们将探索如何有效地防范网络攻击,保护信息安全。
|
8天前
|
存储 安全 5G
|
12天前
|
存储 安全 程序员
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第5天】 本文旨在探讨网络安全和信息安全领域的重要方面,包括网络漏洞、加密技术及安全意识。通过深入分析这些关键概念,我们希望提高读者对这些重要领域的理解,并强调在当今数字化世界中保护个人和组织数据的重要性。我们将从网络漏洞的定义及其成因开始,接着介绍常见的加密技术及其应用,最后讨论提升安全意识的方法,以帮助读者更好地保护自己的信息安全。
|
11天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第6天】在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将探讨网络安全漏洞、加密技术和安全意识等方面的内容,以帮助读者更好地了解这些主题,并采取适当的措施保护自己的信息安全。我们将通过代码示例来演示一些常见的安全漏洞,并提供解决方案。最后,我们将强调培养良好的安全意识对于维护个人和组织的信息安全的重要性。
|
9天前
|
安全 算法 网络协议
网络安全的防线:漏洞、加密与意识的三重奏
在数字化时代,网络安全已成为个人和组织不可忽视的重要议题。随着技术的快速发展,网络攻击手段也日益狡猾,保护信息安全就像一场没有硝烟的战争。本文将深入浅出地探讨网络安全的三个关键方面:网络漏洞的危害性、加密技术的重要性以及安全意识的必要性,旨在提升公众对网络安全的认识和防护能力。
|
10天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第7天】随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术、安全意识等方面进行探讨,旨在帮助读者更好地了解网络安全的重要性,提高自身的网络安全防护能力。