首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年7月7日 星期一 10:19am

wfb-ng 开源代码之libsodium应用

  • 25-02-20 11:41
  • 4000
  • 9211
blog.csdn.net

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
  • 1
  • 2
  • 3
  • 4

2.1 秘钥生成

src/keygen.c:

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

2.2 接收端

src/rx.cpp:

  • 初始化
1097     if (sodium_init() < 0)
1098    {
1099        WFB_ERR("Libsodium init failed\n");
1100        return 1;
  • 1
  • 2
  • 3
  • 4
  • 读入 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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 加密会话
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 解密数据
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.3 发射端

src/tx.cpp:

  • 初始化
1640    if (sodium_init() < 0)
1641    {
1642        WFB_ERR("Libsodium init failed\n");
1643        return 1;
  • 1
  • 2
  • 3
  • 4
  • 读入 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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 加密会话
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)
  • 1
  • 2
  • 3
  • 加密数据
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)
  • 1
  • 2
  • 3
  • 4

3. 参考资料

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

4. 补充:典型使用场景

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

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

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

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

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

注:本文转载自blog.csdn.net的lida2003的文章"https://blog.csdn.net/lida2003/article/details/144717865"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top