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