讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 Python 中将原始字节加载为 DH 公钥并计算共享密钥

梦杰同学_1406

梦杰同学_1406

发布时间:2026-02-08 12:47:52

|

642人浏览过

|

来源于php中文网

原创

如何在 Python 中将原始字节加载为 DH 公钥并计算共享密钥

本文介绍如何将 c 端生成的 2048 位原始 dh 公钥字节数组(非 der/pem 编码)安全、正确地导入 python 的 `cryptography` 库,并构建可使用的 dh 公钥对象,进而完成密钥协商与共享密钥派生。

在基于 Diffie-Hellman(DH)的密钥交换场景中,C 端常以裸字节(raw bytes)形式导出公钥(如 uint8_t[256] 表示 2048-bit 大整数),而 Python 端需将其解析为标准密码学对象才能参与密钥派生。关键在于:原始字节本身不包含参数信息(如素数 p、生成元 g),必须显式指定匹配的 DH 参数集——否则无法构造合法公钥。

最常用且推荐的参数是 RFC 3526 定义的 2048-bit MODP Group (Group 14),其 p 为固定大素数,g = 2。以下为完整、可运行的 Python 示例(基于 cryptography>=36.0):

from cryptography.hazmat.primitives.asymmetric import dh
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend

# ✅ 步骤 1:定义原始公钥字节(来自 C 端 TCP 接收)
# 注意:长度必须为 256 字节(2048 bits),高位在前(big-endian)
raw_public_key = bytes([
    0x46, 0x3b, 0x61, 0x04, 0x74, 0x26, 0x81, 0x71, 0xee, 0xba, 0x8b, 0x0e, 0x0e, 0x34, 0x0d, 0x39,
    0x8f, 0xb3, 0xa1, 0x44, 0x63, 0x19, 0x8f, 0x66, 0x6b, 0x80, 0x48, 0x55, 0x8b, 0x96, 0x65, 0x3c,
    # ...(此处省略中间字节,实际使用时请补全全部 256 字节)
    0x7f, 0x5d, 0xf4, 0x28, 0x64, 0x94, 0x59, 0x43, 0xcd, 0x57, 0x87, 0x33, 0x7b, 0xae, 0xee, 0xfe
])

# ✅ 步骤 2:将字节转换为大整数(big-endian 解析)
public_key_int = int.from_bytes(raw_public_key, byteorder='big')

# ✅ 步骤 3:加载标准 2048-bit DH 参数(RFC 3526 Group 14)
# 注意:必须与 C 端使用的参数完全一致!
parameters = dh.DHParameters.generate(2048)  # 或显式使用已知参数(见下方说明)

# ✅ 步骤 4:构建 DH 公钥对象
public_numbers = dh.DHPublicNumbers(public_key_int, parameters.parameter_numbers())
dh_public_key = public_numbers.public_key(default_backend())

# ✅ 步骤 5:假设你已有本地 DH 私钥(由 Python 生成)
# (实际中应复用已生成的私钥,而非每次新建)
private_key = dh.generate_private_key(key_size=2048, backend=default_backend())
shared_key_bytes = private_key.exchange(dh_public_key)  # ✅ 核心:计算共享密钥

# ✅ 步骤 6(可选):使用 HKDF 派生加密密钥(推荐)
derived_key = HKDF(
    algorithm=hashes.SHA256(),
    length=32,
    salt=None,
    info=b'dh-shared-key',
    backend=default_backend()
).derive(shared_key_bytes)

print(f"Shared secret (raw): {shared_key_bytes.hex()[:64]}...")
print(f"Derived AES key: {derived_key.hex()}")

⚠️ 重要注意事项:

python学习
python学习

Python 编程学习助手 skill,面向零基础用户。 当用户表达以下意图时触发: - 学习 Python 基础概念(变量、数据类型、循环、函数、类等) - 请求 Python 练习题或测验 - 请求审查或调试 Python 代码 - 请求 Python 项目实战指导(爬虫、数据分析、Web 开发等入门项目) - 泛化表述如"教我 Python""我想学编程""Python 怎么写""帮我学 Python" 此 skill

下载
  • 参数一致性是前提:C 端必须使用与 Python 端完全相同的 p 和 g。若 C 使用的是自定义参数,请不要调用 dh.generate_parameters(),而应手动构造 DHParameterNumbers(p, g) 并传入已知值。
  • 字节序严格为 big-endian:int.from_bytes(..., byteorder='big') 是唯一正确方式;小端序会导致密钥错误。
  • 长度校验:2048-bit 公钥必须恰好为 256 字节。若接收字节不足,需前置补零(但通常 C 端已按固定长度输出)。
  • 安全性提示:dh.generate_parameters() 在首次调用时会耗时(尤其 2048-bit),建议缓存 parameters 对象或预生成后序列化保存,避免重复计算。

✅ 验证建议:可在 C 端和 Python 端分别用相同私钥对同一公钥执行 DH_compute_key / exchange(),比对共享密钥哈希值是否一致,确保参数与实现完全对齐。

立即学习“Python免费学习笔记(深入)”;

通过以上步骤,即可安全、高效地将裸字节 DH 公钥集成进 Python 密钥协商流程,无需依赖 PEM/DER 编码,满足嵌入式与跨语言协同场景的核心需求。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6659

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3225

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4168

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2845

2025.08.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

40

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

40

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

40

2026.10.22

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn