AES 加密在 Go 与 Python 间互操作的完整实践指南

老静吖_7666

老静吖_7666

2026-05-18

835人浏览

原创

AES 加密在 Go 与 Python 间互操作的完整实践指南

本文详解如何让 go(使用 cfb 模式)与 python(pycryptodome)实现 aes 加密/解密互通,重点解决因默认分段大小不一致(go 用 128-bit,python 默认 8-bit)导致的解密乱码问题,并提供安全、可直接复用的跨语言加解密代码。

本文详解如何让 go(使用 cfb 模式)与 python(pycryptodome)实现 aes 加密/解密互通,重点解决因默认分段大小不一致(go 用 128-bit,python 默认 8-bit)导致的解密乱码问题,并提供安全、可直接复用的跨语言加解密代码。

在构建 Go 服务端 + Python 客户端的加密通信系统时,一个常见却极易踩坑的问题是:双方均使用 AES-CFB 模式,却无法正确解密对方生成的密文。典型现象包括:首字节正确、后续全乱码;或解密结果头部出现大量不可读填充字节(如 wØ™¹ÒÓ*2)±¶œo%)。根本原因并非密钥或 IV 错误,而是 CFB 模式的 segment size(分段大小)默认值不一致:

  • ✅ Go 标准库 cipher.NewCFBEncrypter / NewCFBDecrypter 固定使用 128-bit(即 16 字节)分段,等同于 AES.MODE_CFB with segment_size=128;
  • ❌ Python 的 PyCryptodome 中 AES.MODE_CFB 默认使用 8-bit(1 字节)分段,这是为向后兼容旧协议保留的行为,与 Go 不兼容。

因此,即使密钥、IV、明文完全相同,因加密链路中每一段的反馈依赖不同粒度的数据,最终密文和解密结果必然错位。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

✅ 正确做法:统一指定 segment_size = 128

Python 端(需 PyCryptodome ≥ 3.4.7)

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64

def aes_cfb_encrypt(key: bytes, plaintext: bytes) -> str:
    """AES-128-CFB 加密(128-bit segment),URL-safe Base64 输出"""
    iv = get_random_bytes(AES.block_size)  # 16 bytes
    cipher = AES.new(key, AES.MODE_CFB, iv=iv, segment_size=128)
    ciphertext = cipher.encrypt(plaintext)
    # 拼接 IV + 密文,Base64 URL-safe 编码(无填充)
    return base64.urlsafe_b64encode(iv + ciphertext).rstrip(b'=').decode('ascii')

def aes_cfb_decrypt(key: bytes, encoded: str) -> bytes:
    """AES-128-CFB 解密(128-bit segment),支持 URL-safe Base64 输入"""
    try:
        # 补齐 Base64 填充并解码
        padded = encoded + '=' * (4 - len(encoded) % 4)
        data = base64.urlsafe_b64decode(padded.encode('ascii'))
    except Exception as e:
        raise ValueError("Invalid base64 input") from e

    if len(data) <h4>Go 端(标准库,无需额外依赖)</h4><pre class="brush:php;toolbar:false;">package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/base64"
    "io"
    "errors"
)

// Encrypt returns URL-safe base64-encoded AES-128-CFB ciphertext (IV + encrypted)
func Encrypt(key, plaintext []byte) (string, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }
    if len(key) != 16 {
        return "", errors.New("key must be 16 bytes for AES-128")
    }

    ciphertext := make([]byte, aes.BlockSize+len(plaintext))
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return "", err
    }

    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)

    // URL-safe base64 encoding (no padding)
    return base64.URLEncoding.EncodeToString(ciphertext), nil
}

// Decrypt decodes URL-safe base64 and decrypts AES-128-CFB
func Decrypt(key []byte, encoded string) ([]byte, error) {
    data, err := base64.URLEncoding.DecodeString(encoded)
    if err != nil {
        return nil, err
    }
    if len(data) <h3>? 关键注意事项</h3>
  • 密钥长度必须严格匹配:AES-128 要求密钥为 16 字节(128 bits)。若使用 "asdfasdfasdfasdf" 字符串,请确保其 UTF-8 编码长度为 16(推荐直接使用 []byte{...} 或 hex.DecodeString("...") 初始化)。
  • IV 必须随机且每次加密唯一:两段代码均已通过 rand.Reader / get_random_bytes 安全生成 IV,切勿复用 IV。
  • 不要手动填充明文:CFB 是流模式,无需 PKCS#7 填充。上述代码对任意长度明文均有效。
  • 传输格式统一:始终采用 IV || ciphertext 拼接 + URL-safe Base64(base64.URLEncoding / urlsafe_b64encode),避免 + 和 / 在 HTTP 中被转义。
  • 安全增强建议:
    • 添加消息认证(HMAC-SHA256 或 AES-GCM)防止篡改;
    • 使用唯一 nonce + 时间戳 + 签名防御重放攻击;
    • 生产环境禁用裸 AES-CFB,优先选用 AEAD 模式(如 AES-GCM)。

✅ 验证示例(两端互通)

# Python 加密 → Go 解密
key = b"1234567890123456"  # 16 bytes
enc = aes_cfb_encrypt(key, b"Hello from Python!")
print("Python encrypted:", enc)

# 将 enc 字符串传给 Go 服务端调用 Decrypt(...) → 应得 "Hello from Python!"
// Go 加密 → Python 解密
key := []byte("1234567890123456")
enc, _ := Encrypt(key, []byte("Hello from Go!"))
fmt.Println("Go encrypted:", enc)

// 将 enc 字符串传给 Python 调用 aes_cfb_decrypt(...) → 应得 "Hello from Go!"

只要 segment_size 统一为 128,密钥、IV、编码方式一致,Go 与 Python 的 AES-CFB 即可无缝互通。牢记:CFB 的互操作性核心在于 segment_size,而非“是否用了 CFB” —— 这是跨语言加密集成中最隐蔽也最关键的配置点。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1811

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4764

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1749

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

28297

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3407

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3407

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2643

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习