OPEN_API接口文档
  1. 文档
OPEN_API接口文档
  • 文档
    • 接口文档
    • 云函数最佳使用
    • CLI使用教程
    • 普通请求
    • 加密请求
    • 接口管理-接口拓展
    • 自定义验签算法
    • TCP_CLIENT链接
    • DH密钥交换
    • 常见问题
      • 通用解答
      • 功能答疑
  • 单码接口
    • 单码以卡充卡
      GET
    • 获取单码信息接口
      GET
    • 单码登出
      GET
    • 单码心跳接口
      GET
    • 单码登录
      GET
    • 单码解绑
      GET
  • 会员接口
    • 用户登录
      GET
    • 获取会员信息(已登录)
      GET
    • 用户注册
      GET
    • 用户登出
      GET
    • 用户心跳
      GET
    • 获取会员信息(未登录)
      GET
    • 用户解绑
      GET
    • 用户充值
      GET
    • 修改密码(已登录)
      GET
    • 修改密码(未登录)
      GET
    • 修改昵称
      GET
    • 查询工单类型
      GET
    • 添加新的反馈主题
      GET
    • 获取已登录用户的所有反馈主题
      GET
    • 获取反馈主题下的聊天记录
      GET
    • 发送聊天消息
      GET
  • 通用接口
    • 获取程序变量
    • 获取程序版本列表
    • 获取最新版本
    • 云函数
    • 设置私有数据
    • 获取私有数据
    • 获取应用免费状态
  1. 文档

DH密钥交换

DH加密使用指南#

本文主要使用对接案例中的C++开发案例进行介绍

什么是DH加密?#

DH(Diffie-Hellman)密钥交换是一种密码学协议,允许两个通信方在不安全的信道上建立一个共享密钥。这个共享密钥可以用于后续的对称加密通信。

核心特点#

非对称加密基础:基于离散对数问题的数学难题
密钥交换协议:不直接传输密钥,而是通过交换公开信息来生成共享密钥
前向安全性:即使攻击者截获了通信内容,也无法计算出共享密钥
无需预共享密钥:双方不需要事先共享密钥

工作原理#

1.
参数协商:双方约定两个公开参数 p(大质数)和 g(生成元)
2.
生成密钥对:
客户端生成私钥 a,计算公钥 A = g^a mod p
服务端生成私钥 b,计算公钥 B = g^b mod p
3.
交换公钥:双方交换各自的公钥
4.
计算共享密钥:
客户端计算:K = B^a mod p
服务端计算:K = A^b mod p
双方得到相同的共享密钥 K = g^(ab) mod p

本项目中的DH加密实现#

本项目使用 DH密钥交换 + AES-128/ECB/PKCS5Padding 的组合方案:
1.
密钥交换阶段:使用DH协议生成共享密钥
2.
数据加密阶段:使用共享密钥进行AES对称加密

技术栈#

密钥交换:Diffie-Hellman(2048位)
对称加密:AES-128/ECB/PKCS5Padding
编码方式:Base64
密钥格式:X.509 SubjectPublicKeyInfo(DER编码,十六进制)

使用方法#

1. 配置服务端公钥#

在 network_program.h 中配置服务端的DH公钥:

2. 客户端密钥对管理#

客户端密钥对会在首次使用时自动生成,并自动赋值给全局变量:
注意:首次运行时,程序会自动生成密钥对并输出,你可以选择保存这些密钥以便后续使用。

3. 加密数据#

使用 reqCommonInit() 函数加密请求参数:

4. 解密响应#

使用 decrypt_response() 函数解密服务端响应:

核心函数说明#

密钥管理#

get_client_dh_keypair()#

获取或初始化客户端DH密钥对(全局缓存,只初始化一次)

load_server_dh_public_key(hex_public_key)#

加载服务端DH公钥

generate_client_dh_keypair(server_dh)#

生成客户端DH密钥对

加密解密#

dh_encrypt_with_server_key(plaintext, server_public_key_hex, client_dh)#

使用服务端公钥和客户端密钥对进行加密

dh_decrypt_with_server_key(ciphertext_base64, server_public_key_hex, client_dh)#

使用服务端公钥和客户端密钥对进行解密

安全注意事项#

1.
密钥保护:
私钥必须严格保密,不能泄露
公钥可以公开传输
2.
密钥长度:
本项目使用2048位DH参数,提供足够的安全性
AES-128提供128位安全强度
3.
密钥轮换:
建议定期更换密钥对
每次会话可以使用不同的密钥对
4.
传输安全:
DH密钥交换本身不保证传输安全
建议在HTTPS等安全通道上使用

常见问题#

Q: 为什么客户端公钥格式是X.509?#

A: 为了与Java服务端兼容。Java的X509EncodedKeySpec需要X.509格式的公钥,因此客户端公钥使用X.509 SubjectPublicKeyInfo格式编码。

Q: 共享密钥长度是多少?#

A: DH共享密钥的长度取决于DH参数的大小。2048位DH参数通常生成256字节的共享密钥,但本项目固定使用前16字节作为AES-128的密钥。

Q: 如何保存和重用密钥对?#

A: 首次运行时,程序会输出生成的密钥对。你可以将这些密钥保存到network_program.h中的client_dh_private_key和client_dh_public_key变量中,下次运行时就会使用保存的密钥。

Q: 加密失败怎么办?#

A: 检查以下几点:
服务端公钥格式是否正确
密钥对是否已正确初始化
数据长度是否符合要求
查看错误日志获取详细信息

技术细节#

AES加密配置#

算法:AES-128
模式:ECB(Electronic Codebook)
填充:PKCS5Padding(等同于PKCS7Padding)
密钥长度:16字节(固定)

DH参数#

密钥长度:2048位
参数组:RFC 5114 2048位DH参数组
公钥格式:X.509 SubjectPublicKeyInfo(DER编码)

参考资料#

Diffie-Hellman密钥交换 - Wikipedia
修改于 2026-02-13 02:20:47
上一页
TCP_CLIENT链接
下一页
通用解答
Built with