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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
性能测试 PTS,5000VUM额度
简介: 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 中都有出色的支持。根据项目的具体需求,可以灵活选择合适的语言和实现方式。


目录
相关文章
|
10天前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
26天前
|
监控 算法 安全
深度洞察内网监控电脑:基于Python的流量分析算法
在当今数字化环境中,内网监控电脑作为“守城卫士”,通过流量分析算法确保内网安全、稳定运行。基于Python的流量分析算法,利用`scapy`等工具捕获和解析数据包,提取关键信息,区分正常与异常流量。结合机器学习和可视化技术,进一步提升内网监控的精准性和效率,助力企业防范潜在威胁,保障业务顺畅。本文深入探讨了Python在内网监控中的应用,展示了其实战代码及未来发展方向。
|
1天前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
32 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
3天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
23 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
3天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
27 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
22天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
6天前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
28 10
|
3天前
|
存储 监控 算法
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。
|
24天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
50 17
|
1月前
|
存储 监控 算法
员工电脑监控屏幕场景下 Python 哈希表算法的探索
在数字化办公时代,员工电脑监控屏幕是保障信息安全和提升效率的重要手段。本文探讨哈希表算法在该场景中的应用,通过Python代码例程展示如何使用哈希表存储和查询员工操作记录,并结合数据库实现数据持久化,助力企业打造高效、安全的办公环境。哈希表在快速检索员工信息、优化系统性能方面发挥关键作用,为企业管理提供有力支持。
45 20

热门文章

最新文章