喵咕网络验证
    • 接口文档
    • 普通请求
    • 加密请求
    • 云函数使用文档
    • CLI使用文档
    • 接口管理-接口拓展
    • DH加密使用指南
    • TCP验证对接文档
    • 单码接口
      • 获取单码信息接口
        GET
      • 单码以卡充卡
        GET
      • 单码登出
        GET
      • 单码心跳接口
        GET
      • 单码登录
        GET
      • 单码解绑
        GET
    • 会员接口
      • 用户登录
        GET
      • 获取会员信息(已登录)
        GET
      • 用户注册
        GET
      • 用户登出
        GET
      • 用户心跳
        GET
      • 获取会员信息(未登录)
        GET
      • 用户解绑
        GET
      • 用户充值
        GET
      • 修改密码(已登录)
        GET
      • 修改密码(未登录)
        GET
      • 修改昵称
        GET
      • 查询工单类型
        GET
      • 添加新的反馈主题
        GET
      • 获取已登录用户的所有反馈主题
        GET
      • 获取反馈主题下的聊天记录
        GET
      • 发送聊天消息
        GET
    • 通用接口
      • 获取程序变量
      • 获取应用免费状态
      • 获取程序版本列表
      • 获取最新版本
      • 云函数
      • 设置私有数据
      • 获取私有数据
    • MGALV2
      • MGALV2介绍
      • MGALV2-各种加密方式
      • MGALV2-VPN代理检测
      • MGALV2-随机数与机器码
      • MGALV2-程序变量获取
      • MGALV2-版本更新检测
      • MGALV2-单码登录
      • MGALV2-单码解绑
      • MGALV2-单码心跳
      • MGALV2-MGUI
      • MGALV2-实战演示
    • 文档
      • 接口文档
      • 云函数最佳使用
      • CLI使用教程
      • 普通请求
      • 加密请求
      • 接口管理-接口拓展
      • 常见问题
        • 通用解答
        • 功能答疑

    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-03-09 05:36:43
    上一页
    接口管理-接口拓展
    下一页
    TCP验证对接文档
    Built with