Rust加密库tor-llcrypto的使用:专为Tor网络优化的轻量级密码学组件
Rust加密库tor-llcrypto的使用:专为Tor网络优化的轻量级密码学组件
概述
tor-llcrypto
crate封装了Tor所需的低级加密原语,并提供了一些实现Tor协议时常用的密码学功能。
这个crate是Arti项目的一部分,Arti是一个用Rust实现Tor的项目。Arti中的许多其他crate都依赖它。
为什么单独一个crate?
通过在tor-llcrypto
中收集和重新导出我们的加密功能,而不是让Arti中的不同crate直接使用底层加密crate,我们确保在整个生态系统中使用相同的实现,并提供一个统一的地方来升级和测试我们的加密功能。
内容
加密功能在cipher
模块中实现:目前只暴露或需要AES。
密码学摘要算法在d
模块中:Tor协议在不同地方使用了几种摘要算法,这些都收集在这里。
公钥密码学(包括签名、加密和密钥协商)在pk
模块中。Tor协议的旧部分需要RSA;新部分基于Curve25519和Ed25519。这里还有用于这些对称算法所用密钥的密钥操作功能。
util
模块有一些用于操作密码学相关对象和代码的杂项兼容性实用工具。
编译时特性
cvt-x25519
- 导出用于将ed25519密钥转换为x25519的函数,反之亦然hsv3-client
- 启用仅作为v3洋葱服务客户端运行时需要的加密功能hsv3-service
- 启用仅作为v3洋葱服务运行时需要的加密功能keymgr
- 启用仅用于密钥管理所需的加密功能memquota-memcost
- 为许多类型实现tor_memquota::HasMemoryCost
relay
- 启用仅在relay上使用的加密功能full
- 启用上述所有功能
加速特性
这些特性不应从库中默认启用,因为它们不是"严格可加的":它们会禁用一种实现以启用另一种。
with-openssl
- 使用openssl
作为后端支持那些它支持的加密特性
with-sha1-asm
- 使用sha1算法的汇编实现(如果启用)
示例代码
// 示例:使用tor-llcrypto进行Ed25519签名
use tor_llcrypto::pk::ed25519;
fn main() {
// 生成Ed25519密钥对
let keypair = ed25519::Keypair::generate(&mut rand::thread_rng());
// 要签名的消息
let message = b"Hello, Tor network!";
// 签名
let signature = keypair.sign(message);
// 验证签名
assert!(keypair::verify(message, &signature).is_ok());
println!("Signature verified successfully!");
}
// 示例:使用tor-llcrypto进行AES加密
use tor_llcrypto::cipher::aes::{Aes128, Aes128Ctr};
fn aes_encrypt_decrypt() {
// 密钥和初始向量
let key = [0u8; 16]; // 实际应用中应该使用随机密钥
let iv = [0u8; 16]; // 实际应用中应该使用随机IV
// 创建AES-CTR加密器
let mut cipher = Aes128Ctr::new(&key.into(), &iv.into());
// 要加密的数据
let mut data = *b"Hello, secure Tor!";
// 加密(CTR模式是在原处加密)
cipher.apply_keystream(&mut data);
println!("Encrypted: {:?}", &data);
// 解密(CTR模式解密是相同的操作)
let mut cipher = Aes128Ctr::new(&key.into(), &iv.into());
cipher.apply_keystream(&mut data);
println!("Decrypted: {}", String::from_utf8_lossy(&data));
}
// 示例:使用tor-llcrypto进行SHA1摘要计算
use tor_llcrypto::d::sha1;
fn sha1_digest() {
// 输入数据
let data = b"Hello, Tor!";
// 计算SHA1摘要
let digest = sha1::digest(data);
println!("SHA1 digest: {:x}", digest);
}
完整示例代码
// 完整示例:使用tor-llcrypto进行加密操作
use tor_llcrypto::{
pk::ed25519,
cipher::aes::{Aes128, Aes128Ctr},
d::sha1
};
use rand::thread_rng;
fn main() {
// 1. Ed25519签名示例
let keypair = ed25519::Keypair::generate(&mut thread_rng());
let message = b"Secure Tor message";
let signature = keypair.sign(message);
println!("Ed25519 signature verified: {}",
keypair.verify(message, &signature).is_ok());
// 2. AES加密示例
let mut key = [0u8; 16];
let mut iv = [0u8; 16];
thread_rng().fill(&mut key);
thread_rng().fill(&mut iv);
let mut data = *b"Secret message";
println!("Original: {:?}", data);
let mut cipher = Aes128Ctr::new(&key.into(), &iv.into());
cipher.apply_keystream(&mut data);
println!("Encrypted: {:?}", data);
let mut cipher = Aes128Ctr::new(&key.into(), &iv.into());
cipher.apply_keystream(&mut data);
println!("Decrypted: {:?}", data);
// 3. SHA1摘要计算
let input = b"Hash this data";
let digest = sha1::digest(input);
println!("SHA1 digest: {:x}", digest);
}
许可证:MIT OR Apache-2.0
Rust加密库tor-llcrypto的使用:专为Tor网络优化的轻量级密码学组件
tor-llcrypto
是一个专为Tor网络设计的轻量级密码学库,它提供了Tor协议所需的核心加密功能,同时保持精简和高效。
主要特性
- 专为Tor网络优化的加密实现
- 轻量级设计,减少依赖
- 提供Tor所需的各种加密原语
- 注重安全性和性能平衡
安装方法
在Cargo.toml中添加依赖:
[dependencies]
tor-llcrypto = "0.4"
核心功能及使用示例
1. 哈希函数
use tor_llcrypto::d::Sha3_256;
fn main() {
let mut hasher = Sha3_256::new();
hasher.update(b"hello world");
let result = hasher.finalize();
println!("SHA3-256 hash: {:x}", result);
}
2. 对称加密
use tor_llcrypto::cipher::aes::Aes256Ctr;
use tor_llcrypto::util::ct::CtByteArray;
fn encrypt_decrypt() {
let key = [0u8; 32]; // 实际应用中应使用安全生成的密钥
let iv = [0u8; 16]; // 初始化向量
let cipher = Aes256Ctr::new(&key.into(), &iv.into());
let plaintext = b"secret message";
let mut buffer = plaintext.to_vec();
// 加密
cipher.apply_keystream(&mut buffer);
// 解密 (CTR模式下加密解密相同)
cipher.apply_keystream(&mut buffer);
assert_eq!(&buffer, plaintext);
}
3. Diffie-Hellman密钥交换
use tor_llcrypto::pk::curve25519;
fn key_exchange() {
// 生成密钥对
let alice_private = curve25519::StaticSecret::new(rand::thread_rng());
let alice_public = curve25519::PublicKey::from(&alice_private);
let bob_private = curve25519::StaticSecret::new(rand::thread_rng());
let bob_public = curve25519::PublicKey::from(&bob_private);
// 计算共享密钥
let alice_shared = alice_private.diffie_hellman(&bob_public);
let bob_shared = bob_private.diffie_hellman(&alice_public);
assert_eq!(alice_shared.as_bytes(), bob_shared.as_bytes());
}
4. 签名验证
use tor_llcrypto::pk::ed25519;
fn sign_verify() {
// 生成密钥对
let keypair = ed25519::Keypair::generate(&mut rand::thread_rng());
let message = b"important message";
// 签名
let signature = keypair.sign(message);
// 验证
assert!(keypair.verify(message, &signature).is_ok());
// 使用公钥验证
let public_key = ed25519::PublicKey::from(&keypair);
assert!(public_key.verify(message, &signature).is_ok());
}
完整示例Demo
下面是一个整合了上述功能的完整示例:
use tor_llcrypto::d::Sha3_256;
use tor_llcrypto::cipher::aes::Aes256Ctr;
use tor_llcrypto::util::ct::CtByteArray;
use tor_llcrypto::pk::{curve25519, ed25519};
use rand::Rng;
fn main() {
// 1. 哈希函数示例
println!("=== 哈希函数示例 ===");
hash_example();
// 2. 对称加密示例
println!("\n=== 对称加密示例 ===");
symmetric_encryption_example();
// 3. Diffie-Hellman密钥交换示例
println!("\n=== Diffie-Hellman密钥交换示例 ===");
diffie_hellman_example();
// 4. 签名验证示例
println!("\n=== 签名验证示例 ===");
signature_example();
}
fn hash_example() {
let mut hasher = Sha3_256::new();
hasher.update(b"hello world");
let result = hasher.finalize();
println!("SHA3-256哈希值: {:x}", result);
}
fn symmetric_encryption_example() {
// 生成随机密钥和IV
let mut rng = rand::thread_rng();
let mut key = [0u8; 32];
let mut iv = [0u8; 16];
rng.fill(&mut key);
rng.fill(&mut iv);
let cipher = Aes256Ctr::new(&key.into(), &iv.into());
let plaintext = b"secret message";
let mut buffer = plaintext.to_vec();
// 加密
cipher.apply_keystream(&mut buffer);
println!("加密后的数据: {:?}", buffer);
// 解密
cipher.apply_keystream(&mut buffer);
println!("解密后的数据: {:?}", buffer);
assert_eq!(&buffer, plaintext);
}
fn diffie_hellman_example() {
// Alice生成密钥对
let alice_private = curve25519::StaticSecret::new(rand::thread_rng());
let alice_public = curve25519::PublicKey::from(&alice_private);
// Bob生成密钥对
let bob_private = curve25519::StaticSecret::new(rand::thread_rng());
let bob_public = curve25519::PublicKey::from(&bob_private);
// 计算共享密钥
let alice_shared = alice_private.diffie_hellman(&bob_public);
let bob_shared = bob_private.diffie_hellman(&alice_public);
println!("Alice的共享密钥: {:?}", alice_shared.as_bytes());
println!("Bob的共享密钥: {:?}", bob_shared.as_bytes());
assert_eq!(alice_shared.as_bytes(), bob_shared.as_bytes());
}
fn signature_example() {
// 生成密钥对
let keypair = ed25519::Keypair::generate(&mut rand::thread_rng());
let message = b"important message";
// 签名
let signature = keypair.sign(message);
println!("签名: {:?}", signature);
// 验证签名
let verify_result = keypair.verify(message, &signature);
println!("验证结果: {:?}", verify_result.is_ok());
// 使用公钥验证
let public_key = ed25519::PublicKey::from(&keypair);
let pub_verify_result = public_key.verify(message, &signature);
println!("使用公钥验证结果: {:?}", pub_verify_result.is_ok());
}
注意事项
tor-llcrypto
专为Tor网络设计,某些实现可能不符合通用加密库的标准- 在生产环境中使用前,请仔细阅读Tor项目的安全建议
- 密钥管理应遵循最佳实践,示例中的硬编码密钥仅用于演示
性能优化建议
- 重用加密对象而不是频繁创建新实例
- 对于流式数据,使用流式接口而不是一次性处理
- 考虑使用零拷贝操作减少内存分配
tor-llcrypto
作为Tor生态的一部分,经过了严格的安全审计,是构建Tor兼容应用的可靠选择。