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


1 回复

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());
}

注意事项

  1. tor-llcrypto专为Tor网络设计,某些实现可能不符合通用加密库的标准
  2. 在生产环境中使用前,请仔细阅读Tor项目的安全建议
  3. 密钥管理应遵循最佳实践,示例中的硬编码密钥仅用于演示

性能优化建议

  • 重用加密对象而不是频繁创建新实例
  • 对于流式数据,使用流式接口而不是一次性处理
  • 考虑使用零拷贝操作减少内存分配

tor-llcrypto作为Tor生态的一部分,经过了严格的安全审计,是构建Tor兼容应用的可靠选择。

回到顶部