当前位置: 首页 > article >正文

wfb-ng 开源代码之libsodium应用

wfb-ng 开源代码之libsodium应用

  • 1. 源由
  • 2. 代码结构
    • 2.1 秘钥生成
    • 2.2 接收端
    • 2.3 发射端
  • 3. 参考资料
  • 4. 补充:典型使用场景

1. 源由

Libsodium 是一个广泛使用的高效且易于使用的加密库,旨在为开发人员提供安全、现代化的加密算法。它是 NaCl (Networking and Cryptography Library) 的一个分支和改进版本,主要目的是提供易用、可靠、跨平台的加密功能,同时避免常见的加密陷阱和复杂的低级加密实现。

wfb-ng的加密就是基于这个算法库,为此了解下在wfb-ng这个传输协议上的应用。

2. 代码结构

src
 ├──> keygen.c
 ├──> rx.cpp
 └──> tx.cpp

2.1 秘钥生成

src/keygen.c:

  • 初始化
52    if (sodium_init() < 0)
53    {
54        fprintf(stderr, "Libsodium init failed\n");
55        return 1;
  • 生成drone.key
71    fwrite(drone_secretkey, crypto_box_SECRETKEYBYTES, 1, fp);
72    fwrite(gs_publickey, crypto_box_PUBLICKEYBYTES, 1, fp);
  • 生成gs.key
83    fwrite(gs_secretkey, crypto_box_SECRETKEYBYTES, 1, fp);
84    fwrite(drone_publickey, crypto_box_PUBLICKEYBYTES, 1, fp);

2.2 接收端

src/rx.cpp:

  • 初始化
1097     if (sodium_init() < 0)
1098    {
1099        WFB_ERR("Libsodium init failed\n");
1100        return 1;
  • 读入 rx_secretkey + tx_publickey
284    if((fp = fopen(keypair.c_str(), "r")) == NULL)
285    {
286        throw runtime_error(string_format("Unable to open %s: %s", keypair.c_str(), strerror(errno)));
287    }
288    if (fread(rx_secretkey, crypto_box_SECRETKEYBYTES, 1, fp) != 1)
289    {
290        fclose(fp);
291        throw runtime_error(string_format("Unable to read rx secret key: %s", strerror(errno)));
292    }
293    if (fread(tx_publickey, crypto_box_PUBLICKEYBYTES, 1, fp) != 1)
294    {
295        fclose(fp);
296        throw runtime_error(string_format("Unable to read tx public key: %s", strerror(errno)));
297    }
298    fclose(fp);
  • 加密会话
598        if(crypto_box_open_easy((uint8_t*)session_tmp,
599                                buf + sizeof(wsession_hdr_t),
600                                size - sizeof(wsession_hdr_t),
601                                ((wsession_hdr_t*)buf)->session_nonce,
602                                tx_publickey, rx_secretkey) != 0)
  • 解密数据
677    if (crypto_aead_chacha20poly1305_decrypt(decrypted, &decrypted_len,
678                                             NULL,
679                                             buf + sizeof(wblock_hdr_t), size - sizeof(wblock_hdr_t),
680                                             buf,
681                                             sizeof(wblock_hdr_t),
682                                             (uint8_t*)(&(block_hdr->data_nonce)), session_key) != 0)

2.3 发射端

src/tx.cpp:

  • 初始化
1640    if (sodium_init() < 0)
1641    {
1642        WFB_ERR("Libsodium init failed\n");
1643        return 1;
  • 读入 tx_secretkey + rx_publickey
69    if ((fp = fopen(keypair.c_str(), "r")) == NULL)
70    {
71        throw runtime_error(string_format("Unable to open %s: %s", keypair.c_str(), strerror(errno)));
72    }
73    if (fread(tx_secretkey, crypto_box_SECRETKEYBYTES, 1, fp) != 1)
74    {
75        fclose(fp);
76        throw runtime_error(string_format("Unable to read tx secret key: %s", strerror(errno)));
77    }
78    if (fread(rx_publickey, crypto_box_PUBLICKEYBYTES, 1, fp) != 1)
79    {
80        fclose(fp);
81        throw runtime_error(string_format("Unable to read rx public key: %s", strerror(errno)));
82    }
83    fclose(fp);
  • 加密会话
181    if (crypto_box_easy(session_packet + sizeof(wsession_hdr_t),
182                        (uint8_t*)tmp, session_data_size,
183                        session_hdr->session_nonce, rx_publickey, tx_secretkey) != 0)
  • 加密数据
555    if (crypto_aead_chacha20poly1305_encrypt(ciphertext + sizeof(wblock_hdr_t), &ciphertext_len,
556                                             block[fragment_idx], packet_size,
557                                             (uint8_t*)block_hdr, sizeof(wblock_hdr_t),
558                                             NULL, (uint8_t*)(&(block_hdr->data_nonce)), session_key) < 0)

3. 参考资料

【1】wfb-ng 开源工程结构&代码框架简明介绍
【2】wfb-ng 开源代码之wfb_tx&wfb_rx
【3】wfb-ng 开源代码之wfb_tx模式更新

4. 补充:典型使用场景

  • 安全通信:
    用于建立加密的消息传递通道,如加密聊天、文件传输和VPN通信等。

  • 数据保护:
    使用对称加密(如 crypto_secretbox)保护数据存储和数据库的机密性。

  • 身份验证和签名:
    用于用户身份验证、数字签名以及确认消息的完整性。

  • 物联网(IoT)和嵌入式设备:
    由于 Libsodium 具有较低的内存和计算开销,非常适合资源受限的设备(如传感器、无人机等)进行安全通信。

  • 区块链和加密货币:
    Libsodium 的高效性和安全性使其适合用于区块链的密钥管理和交易签名。


http://www.kler.cn/a/451516.html

相关文章:

  • 【批量生成WORD和PDF文件】根据表格内容和模板文件批量创建word文件,一次性生成多个word文档和批量创建PDF文件
  • kimi搜索AI多线程批量生成txt原创文章软件-不需要账号及key
  • 灵当CRM getMyAmbassador Sql注入漏洞复现(附脚本)
  • SecureCRT汉化版
  • 谷歌集群数据集:负载均衡云服务测试数据
  • Spring AOP 中记录日志
  • 自动控制系统综合与LabVIEW实现
  • WebAPI编程(第一天,第二天)
  • 科普时刻 | 借助鲁棒性设计解决制造中的不确定性问题
  • 【论文笔记】Cross-lingual few-shot sign language recognition
  • 【深度学习基础之多尺度特征提取】不同尺寸卷积核、不同步长卷积是如何在深度学习网络中提取多尺度特征的?附代码
  • docker 容器的基本使用
  • 鸿蒙Next API 12开发,使用@ohos/axios进行HTTP请求
  • 【电路笔记】-布尔代数真值表
  • 基于springboot的海洋知识服务平台的设计与实现
  • 数据结构与算法作业(五)
  • 【uni-app】2025最新uni-app一键登录保姆级教程(包含前后端获取手机号方法)(超强避坑指南)
  • Pycharm配置PyQt 5
  • Spring Boot 中 Map 的最佳实践
  • dockerfile文档编写(1):基础命令
  • DX12 快速教程(2) —— 渲染天蓝色窗口
  • html + css 淘宝网实战
  • 矩阵方程组求解——Markov过程
  • 黑马Java面试教程_P2_Redis
  • 圆形视频怎么制作?裁剪圆形视频的方法
  • 重温设计模式--单例模式