菜单

加密库

相关源文件

Shadowsocks Windows客户端依赖于两个原生加密库来提供安全的加密功能:libsodium 和 mbedTLS。这些库提供了各种加密原语,供更高级别的加密框架使用,以保护客户端和服务器之间的网络流量。有关这些库如何集成到加密框架的更多信息,请参阅加密框架

原生库概述

Shadowsocks Windows客户端使用一个名为libsscrypto.dll的自定义原生库,该库结合了libsodium和mbedTLS的功能。此库作为资源嵌入到应用程序中,并在运行时解压到临时位置。

来源:shadowsocks-csharp/Encryption/Sodium.cs1-113 shadowsocks-csharp/Encryption/MbedTLS.cs1-109

库初始化

这两个库都遵循类似的初始化模式,即在包装器类的静态初始化期间提取并加载原生DLL。

来源:shadowsocks-csharp/Encryption/Sodium.cs22-55 shadowsocks-csharp/Encryption/MbedTLS.cs20-35

Sodium 库

Sodium 包装器提供了对 libsodium 加密函数的访问,尤其侧重于 AEAD(带关联数据的认证加密)密码和流密码。这些原语构成了 Shadowsocks 客户端和服务器之间安全通信通道的基础。

AEAD 密码

AEAD 密码提供数据的机密性和真实性。支持以下 AEAD 密码:

密码名称功能
ChaCha20-Poly1305 IETFcrypto_aead_chacha20poly1305_ietf_encrypt/decrypt
XChaCha20-Poly1305 IETFcrypto_aead_xchacha20poly1305_ietf_encrypt/decrypt
AES-256-GCMcrypto_aead_aes256gcm_encrypt/decrypt

AES-256-GCM 密码的可用性在运行时检测,因为它可能并非在所有硬件平台上都受支持。

来源:shadowsocks-csharp/Encryption/Sodium.cs66-95

流密码

流密码用于加密数据流。支持以下流密码:

密码名称功能
Salsa20crypto_stream_salsa20_xor_ic
ChaCha20crypto_stream_chacha20_xor_ic
ChaCha20 IETFcrypto_stream_chacha20_ietf_xor_ic

这些函数允许使用提供的密钥、随机数和计数器值对数据进行加密和解密。

来源:shadowsocks-csharp/Encryption/Sodium.cs97-111

MbedTLS 库

MbedTLS 包装器提供了对 mbedTLS 库中各种加密操作的访问。它提供了哈希、通用密码操作和密钥派生功能。

哈希函数

MbedTLS 提供了一个 MD5 哈希函数,该函数用于多种目的,包括某些加密方法中的密钥派生。

来源:shadowsocks-csharp/Encryption/MbedTLS.cs37-43

密码操作

MbedTLS 提供了一个支持各种分组密码的底层密码 API。该 API 遵循以下模式:

  1. 初始化密码上下文
  2. 使用所选算法设置密码
  3. 设置加密密钥和初始化向量 (IV)
  4. 通过密码处理数据
  5. 释放密码上下文

来源:shadowsocks-csharp/Encryption/MbedTLS.cs58-86

HKDF 密钥派生

MbedTLS 提供了 HKDF(基于 HMAC 的密钥派生函数)的实现,该函数用于从输入密钥材料中派生安全的加密密钥。

此功能对于需要从单个共享密钥派生多个密钥的协议尤其重要。

来源:shadowsocks-csharp/Encryption/MbedTLS.cs102-105

与 Shadowsocks 代理集成

加密库是 Shadowsocks 代理机制中的关键组成部分。当客户端通过 Shadowsocks 启动连接时,数据会先使用所选密码进行加密,然后发送到远程服务器。

来源:shadowsocks-csharp/Encryption/Sodium.cs1-113 shadowsocks-csharp/Encryption/MbedTLS.cs1-109

硬件加速检测

Sodium 库内置了硬件加速能力的检测,特别是针对 AES-256-GCM 密码。这使得应用程序能够最佳地利用可用硬件。

当硬件加速可用时,使用 AES-256-GCM 密码的操作将显著加快,从而提高整体代理性能。

来源:shadowsocks-csharp/Encryption/Sodium.cs51-52

错误处理

两个库包装器都包含初始化失败和操作失败的错误处理功能。

  1. 初始化错误:如果库无法正确初始化,则会记录异常,并且在某些情况下会抛出异常。
  2. 操作错误:像MD5()这样的函数会检查原生函数的返回值,如果操作失败则抛出异常。

这确保了加密操作要么正确执行,要么明确失败,这对于安全性至关重要。

来源:shadowsocks-csharp/Encryption/Sodium.cs33-45 shadowsocks-csharp/Encryption/MbedTLS.cs31-42

总结

加密库提供了 Shadowsocks 代理中安全通信所需的加密原语。通过结合 libsodium(用于现代 AEAD 密码)和 mbedTLS(用于传统密码和加密操作)的优势,Shadowsocks 提供了具有良好性能特点的强大加密选项。

这些库是实现 Shadowsocks 协议支持的各种密码方法的高级加密框架的基础。