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 的高效性和安全性使其适合用于区块链的密钥管理和交易签名。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐