Python 和 Go 实现 AES 加密算法的技术详解

简介: Python 和 Go 实现 AES 加密算法的技术详解

AES(Advanced Encryption Standard,高级加密标准)是一种对称密钥加密算法,广泛应用于各种安全通信场景中。AES 使用 128、192 或 256 位的密钥,能够提供不同级别的安全性。本文将详细讲解如何使用 Python 和 Go 来实现 AES 加密算法,提供代码示例并对其进行逐步解析。


1. 什么是 AES 加密算法


AES 是由美国国家标准与技术研究院(NIST)于 2001 年选定的对称密钥加密标准。其特性如下:

对称性:加密和解密使用相同的密钥。

分组加密:将明文数据分为若干个分组,每组 128 位(16 字节),然后逐个分组加密。

安全性:AES 目前被认为是非常安全的加密算法之一,适用于大多数应用。


AES 使用三种不同的密钥长度:128 位、192 位和 256 位。加密的强度随着密钥长度的增加而提高,密钥越长,难度越大。


2. AES 加密的工作原理


AES 加密是基于分组的加密算法,通常工作在不同的模式下,包括:

ECB(Electronic Codebook,电子密码本)模式:每个分组独立加密。缺点是明文分组相同,加密后密文也相同,不推荐使用。

CBC(Cipher Block Chaining,密文分组链接)模式:每个分组的加密依赖于前一个分组的密文和初始化向量(IV),安全性更高。

CFB(Cipher Feedback,密文反馈)模式:类似流模式的加密方式,安全性较高。

GCM(Galois/Counter Mode,伽罗瓦/计数器模式):在计数器模式的基础上增加了身份验证功能,非常适合高安全性需求的场景。


AES 加密和解密的过程包括以下步骤:

1.生成密钥(Key)。

2.初始化向量(IV,适用于需要 IV 的模式,比如 CBC)。

3.对明文进行分组。

4.使用选定的模式对每个分组进行加密。

5.合并加密结果并输出密文。


3. 使用 Python 实现 AES 加密


Python 提供了多种加密库,其中最常用的是 pycryptodome 库,它提供了 AES 加密的全面支持。


3.1 环境配置


首先,安装 pycryptodome 库:

pip install pycryptodome


3.2 Python 示例代码


我们将使用 CBC 模式来实现 AES 加密,示例如下:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes

# 生成密钥和初始化向量
key = get_random_bytes(16)  # 16 字节的密钥(128 位)
iv = get_random_bytes(16)   # 16 字节的 IV

# 加密函数
def aes_encrypt(plaintext):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    padded_text = pad(plaintext.encode('utf-8'), AES.block_size)
    ciphertext = cipher.encrypt(padded_text)
    return ciphertext
    
# 解密函数
def aes_decrypt(ciphertext):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    padded_plaintext = cipher.decrypt(ciphertext)
    plaintext = unpad(padded_plaintext, AES.block_size)
    return plaintext.decode('utf-8')
    
# 示例使用
plaintext = "Hello, AES in Python!"
ciphertext = aes_encrypt(plaintext)
print(f"密文: {ciphertext}")

# 解密
decrypted_text = aes_decrypt(ciphertext)
print(f"解密后的明文: {decrypted_text}")


3.3 代码详解


1.生成密钥和 IV:get_random_bytes(16) 用于生成 16 字节(128 位)的随机密钥和初始化向量(IV)。CBC 模式要求 IV 必须与密钥的长度相同。

2.加密过程:

使用 AES.new() 初始化 AES 加密对象,指定模式为 AES.MODE_CBC 并传入密钥和 IV。

使用 pad() 方法对明文进行填充,使其长度为 AES 的分组大小的倍数(16 字节)。

使用 encrypt() 方法对填充后的明文进行加密。

3.解密过程:

使用与加密时相同的密钥和 IV 初始化 AES 解密对象。

使用 decrypt() 方法对密文进行解密,得到填充后的明文。

使用 unpad() 方法去除填充,恢复原始明文。


4. 使用 Go 实现 AES 加密


Go 语言中使用 crypto/aes 和 crypto/cipher 包可以轻松实现 AES 加密。


4.1 环境配置


Go 标准库已经包含了 AES 加密所需的包,无需额外安装。


4.2 Go 示例代码


下面是使用 Go 实现 AES-CBC 模式的代码:

package main

import (
  "crypto/aes"
  "crypto/cipher"
  "crypto/rand"
  "crypto/sha256"
  "encoding/hex"
  "fmt"
  "io"
)

// 生成 32 字节的密钥(256 位 AES)
func generateKey() []byte {
  key := sha256.Sum256([]byte("mysecretpassword"))
  return key[:]
}

// AES 加密函数
func aesEncrypt(plaintext string, key []byte) (string, error) {
  block, err := aes.NewCipher(key)
  if err != nil {
  return "", err
  }
  
  ciphertext := make([]byte, aes.BlockSize+len(plaintext))
  iv := ciphertext[:aes.BlockSize]
  
  // 生成随机 IV
  if _, err := io.ReadFull(rand.Reader, iv); err != nil {
  return "", err
  }
  
  stream := cipher.NewCBCEncrypter(block, iv)
  stream.CryptBlocks(ciphertext[aes.BlockSize:], []byte(plaintext))
  
  return hex.EncodeToString(ciphertext), nil
}

// AES 解密函数
func aesDecrypt(cipherHex string, key []byte) (string, error) {
  ciphertext, _ := hex.DecodeString(cipherHex)
  block, err := aes.NewCipher(key)
  if err != nil {
  return "", err
  }
  
  iv := ciphertext[:aes.BlockSize]
  ciphertext = ciphertext[aes.BlockSize:]
  
  stream := cipher.NewCBCDecrypter(block, iv)
  stream.CryptBlocks(ciphertext, ciphertext)
  
  return string(ciphertext), nil
}

func main() {
  plaintext := "Hello, AES in Go!"
  
  // 生成密钥
  key := generateKey()
  
  // 加密
  ciphertext, err := aesEncrypt(plaintext, key)
  if err != nil {
  fmt.Println("加密错误:", err)
  return
  }
  fmt.Println("加密后的密文:", ciphertext)
  
  // 解密
  decryptedText, err := aesDecrypt(ciphertext, key)
  if err != nil {
  fmt.Println("解密错误:", err)
  return
  }
  fmt.Println("解密后的明文:", decryptedText)
}



4.3 代码详解


1.生成密钥:使用 sha256.Sum256() 方法生成 256 位的密钥。

2.加密过程:

使用 aes.NewCipher() 方法创建 AES 加密块,要求密钥长度为 16、24 或 32 字节。

生成随机 IV,并创建 CBC 加密器 cipher.NewCBCEncrypter()。

使用 CryptBlocks() 方法对明文进行加密,并将结果编码为十六进制字符串输出。

3.解密过程:

读取 IV 并使用与加密相同的密钥创建解密器 cipher.NewCBCDecrypter()。

使用 CryptBlocks() 解密密文,返回解密后的明文。


5. Python 与 Go 实现的性能比较


5.1 性能测试


我们可以通过对 Python 和 Go 的 AES 实现进行相同条件下的性能测试来评估它们的执行效率。

加密时间:Go 通常比 Python 更快,主要得益于其编译型语言的特性和更好的内存管理。

易用性:Python 的库提供了更高层次的抽象,代码简洁,而 Go 需要更多的手动管理操作。


5.2 结果对比


为了对比 Python 和 Go 在 AES 加密上的性能,我们可以对相同大小的数据进行加密和解密操作,并测量它们的耗时。

假设我们使用相同的硬件环境进行实验,处理 1 MB 的数据,并分别记录 Python 和 Go 的执行时间。

# Python AES 性能测试
import time

# 加密性能测试
start_time = time.time()
for _ in range(100):
    aes_encrypt("A" * 1024 * 1024)
end_time = time.time()
print(f"Python 加密 100 次的总时间: {end_time - start_time} 秒")

# 解密性能测试
start_time = time.time()
for _ in range(100):
    aes_decrypt(ciphertext)
end_time = time.time()
print(f"Python 解密 100 次的总时间: {end_time - start_time} 秒")


在 Go 中,我们可以使用类似的方式进行性能测试:

package main

import (
  "fmt"
  "time"
)

func performanceTest() {
  plaintext := "A" * 1024 * 1024  // 1 MB 数据
  key := generateKey()
  
  // 加密性能测试  
  start := time.Now()
  for i := 0; i < 100; i++ {
  _, err := aesEncrypt(plaintext, key)
  if err != nil {
    fmt.Println("加密错误:", err)
    return
  }
  }
  fmt.Printf("Go 加密 100 次的总时间: %v\n", time.Since(start))
  
  // 解密性能测试  
  ciphertext, _ := aesEncrypt(plaintext, key)
  start = time.Now()
  for i := 0; i < 100; i++ {
  _, err := aesDecrypt(ciphertext, key)
  if err != nil {
    fmt.Println("解密错误:", err)
    return
  }
  }
  fmt.Printf("Go 解密 100 次的总时间: %v\n", time.Since(start))
}


性能分析


1.执行速度:通常,Go 的 AES 加密执行时间会比 Python 更快,因为 Go 是编译型语言,直接生成机器代码,执行效率更高。而 Python 是解释型语言,运行时的动态解析会消耗额外的时间。

2.内存管理:Python 的内存管理相对更自动化,开发者可以专注于应用逻辑,而不需要过多考虑内存泄露等问题。然而,这种自动化也会带来额外的开销。相比之下,Go 的内存管理机制更为直接和轻量,因此在处理大数据加密时,其性能表现更加出色。

3.代码复杂度:从代码编写的角度来看,Python 的加密库提供了更多高级封装,使得代码更加简洁和易于理解。Go 由于其系统级语言的特性,代码通常需要更详细的管理步骤,比如 IV 的生成和加密块的显式管理。


6. 总结


在这篇文章中,我们通过实例演示了如何使用 Python 和 Go 来实现 AES 加密算法,并对它们的性能进行了比较。我们得出以下结论:

Python 实现:使用 pycryptodome 库实现 AES 加密相对简单,代码易于阅读和编写,非常适合需要快速实现安全加密的场景。然而,Python 的执行速度相对较慢,不适合需要高性能的场合。

Go 实现:Go 的标准库中提供了 AES 加密功能,虽然实现上需要更多的代码和手动管理,但其执行效率高,适合处理需要高性能的加密任务。


选择建议


对于开发速度要求较高的项目,建议使用 Python 实现 AES 加密,特别是在安全需求较高但性能需求不太关键的情况下,Python 提供了非常方便的库和简单的代码。

对于需要处理大量加密数据、要求高性能的场景,Go 的 AES 实现更加适合,因为 Go 语言能更好地利用系统资源,并且其编译特性使得执行效率更高。


AES 加密作为对称加密的核心算法之一,在 Python 和 Go 中都有出色的支持。根据项目的具体需求,可以灵活选择合适的语言和实现方式。


目录
相关文章
|
23天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2576 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
163 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
972 14
|
3天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
218 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
734 9