Rust加密库tor-hscrypto的使用:专注于隐私保护与高性能加密算法的Tor网络组件

tor-hscrypto

tor-hscrypto: 洋葱服务使用的基本加密操作

概述

这个crate是Arti项目的一部分,Arti是一个用Rust实现Tor的项目。

洋葱服务和连接它们的客户端需要一些Tor其他部分不使用的加密操作。这些包括:

  • 一组密钥盲化操作,用于从长期公钥派生短期公钥
  • 一个基于SHA3的临时消息认证码
  • 将公钥编码和解码为.onion地址的操作
  • 一组将时间划分为不同"周期"的操作。这些周期用作DHT-style哈希环和密钥盲化操作的输入
  • 用于抵抗拒绝服务攻击的工作量证明方案

这个crate实现了这些操作,以及一组包装类型来帮助我们区分用于洋葱服务的众多密钥和nonce。

编译时特性

  • memquota-memcost – 为许多类型实现tor_memquota::HasMemoryCost。(实际上不会强制编译内存配额跟踪;那是tor-memquota和更高级crate中的memquota)
  • ope – 支持顺序保持加密(Order Preserving Encryption)
  • full – 启用上述所有特性

实验性和不稳定特性

请注意,这些特性启用的API不受语义版本控制保障:我们可能在补丁版本之间破坏或移除它们。

  • hs-pow-full – Tor隐藏服务的工作量证明
  • experimental: 启用所有上述实验性特性

许可证

MIT OR Apache-2.0

当使用pow特性时,我们会链接LGPL许可的依赖项。

示例代码

use tor_hscrypto::{Blinding, Subcredential, TimePeriod, OnionAddress};

// 生成长期身份密钥
let identity_key = x25519_dalek::StaticSecret::new(rand::thread_rng());
let identity_public = x25519_dalek::PublicKey::from(&identity_key);

// 创建时间周期
let now = SystemTime::now();
let period = TimePeriod::new(now, 24 * 60 * 60).unwrap(); // 24小时周期

// 生成子凭证
let subcredential = Subcredential::derive(&identity_key, &period);

// 盲化公钥
let blinded_key = Blinding::blind_pubkey(&identity_public, &period).unwrap();

// 生成.onion地址
let onion_address = OnionAddress::from_public(&blinded_key);

println!("Onion service address: {}", onion_address);

完整示例Demo

use tor_hscrypto::{Blinding, Subcredential, TimePeriod, OnionAddress};
use x25519_dalek::{StaticSecret, PublicKey};
use std::time::SystemTime;

fn main() {
    // 1. 生成身份密钥对
    let identity_secret = StaticSecret::new(rand::thread_rng());
    let identity_public = PublicKey::from(&identity_secret);
    
    // 2. 设置时间周期 (例如24小时)
    let now = SystemTime::now();
    let period = TimePeriod::new(now, 24 * 60 * 60).expect("Failed to create time period");
    
    // 3. 派生子凭证
    let subcredential = Subcredential::derive(&identity_secret, &period);
    
    // 4. 盲化公钥
    let blinded_key = Blinding::blind_pubkey(&identity_public, &period)
        .expect("Failed to blind public key");
    
    // 5. 生成.onion地址
    let onion_address = OnionAddress::from_public(&blinded_key);
    
    println!("Onion Service Setup:");
    println!("- Period: {}", period);
    println!("- Identity Public Key: {:?}", identity_public.as_bytes());
    println!("- Blinded Public Key: {:?}", blinded_key.as_bytes());
    println!("- Onion Address: {}", onion_address);
    
    // 6. 验证周期
    assert!(period.contains(&now), "Current time should be within the period");
    
    // 7. 演示重新计算子凭证
    let subcredential2 = Subcredential::derive(&identity_secret, &period);
    assert_eq!(subcredential, subcredential2, "Subcredentials should match for same period");
}

这个示例展示了如何使用tor-hscrypto创建一个洋葱服务的基本设置,包括:

  1. 生成身份密钥
  2. 设置时间周期
  3. 派生子凭证
  4. 盲化公钥
  5. 生成.onion地址
  6. 验证周期有效性
  7. 验证子凭证的一致性

1 回复

Rust加密库tor-hscrypto的使用:专注于隐私保护与高性能加密算法的Tor网络组件

介绍

tor-hscrypto是Tor网络中的一个高性能加密组件,专门为隐私保护和安全通信设计。它实现了Tor协议中使用的各种加密原语和算法,包括:

  • 分层加密(用于洋葱路由)
  • 高性能的Diffie-Hellman密钥交换
  • 各种哈希和对称加密算法
  • 防篡改的数据格式处理

这个库是Tor项目的一部分,但也可以独立使用,适合需要高级隐私保护功能的Rust应用程序。

安装

在Cargo.toml中添加依赖:

[dependencies]
tor-hscrypto = "0.3"

基本使用方法

1. 创建和验证洋葱服务描述符

use tor_hscrypto::{pk::HsIdKey, time::Period, HsBlindIdKey};

// 生成长期身份密钥
let id_key = HsIdKey::generate();

// 生成盲化密钥(基于当前时间段)
let period = Period::current()?;
let blind_key = HsBlindIdKey::from_id_key(&id_key, period);

// 验证密钥
assert!(blind_key.valid_for_id_key(&id_key, period));

2. 分层加密(Onion加密)

use tor_hscrypto::layers::{OnionPublicKey, OnionSecretKey};

// 生成密钥对
let secret_key = OnionSecretKey::generate();
let public_key = OnionPublicKey::from(&secret_key);

// 加密数据
let plaintext = b"secret message";
let ciphertext = public_key.encrypt(plaintext)?;

// 解密数据
let decrypted = secret_key.decrypt(&ciphertext)?;
assert_eq!(plaintext, &decrypted[..]);

3. Diffie-Hellman密钥交换

use tor_hscrypto::dhe::{EphemeralSecret, PublicKey};

// 双方各生成密钥对
let alice_secret = EphemeralSecret::new();
let bob_secret = EphemeralSecret::new();

let alice_public = PublicKey::from(&alice_secret);
let bob_public = PublicKey::from(&bob_secret);

// 计算共享密钥
let alice_shared = alice_secret.diffie_hellman(&bob_public);
let bob_shared = bob_secret.diffie_hellman(&alice_public);

// 双方得到的共享密钥应该相同
assert_eq!(alice_shared.as_bytes(), bob_shared.as_bytes());

4. 创建和验证签名

use tor_hscrypto::pk::{Ed25519Keypair, Ed25519Signature};

// 生成密钥对
let keypair = Ed25519Keypair::generate();

// 签名数据
let message = b"important data";
let signature = keypair.sign(message);

// 验证签名
assert!(keypair.verify(&signature, message).is_ok());

高级功能

子凭证系统

use tor_hscrypto::subcredential::{Subcredential, HsIdKey};

// 主凭证
let id_key = HsIdKey::generate();

// 生成子凭证
let subcredential = Subcredential::derive(&id_key, b"extra context");

// 验证子凭证
assert!(subcredential.verify(&id_key, b"extra context"));

防篡改的数据格式

use tor_hscrypto::ll::pk::{HsSvcNtorKey, HsSvcNtorKeypair};

// 生成服务密钥对
let keypair = HsSvcNtorKeypair::generate();

// 编码为防篡改格式
let encoded = keypair.private.to_encoded();

// 解码并验证
let decoded = HsSvcNtorKey::from_encoded(&encoded)?;
assert_eq!(decoded.to_public(), keypair.public);

性能提示

  1. 重用密钥对象而不是重复生成
  2. 对大批量数据使用流式加密
  3. 考虑使用rayon并行处理加密操作

安全注意事项

  • 妥善保管私钥
  • 定期轮换密钥
  • 使用最新的库版本
  • 在生产环境中启用所有安全特性

tor-hscrypto为Tor网络提供了强大的加密基础,同时也适用于需要高级隐私保护的应用程序。通过正确使用这个库,开发者可以构建安全、隐私保护的通信系统。

完整示例代码

下面是一个整合了上述功能的完整示例:

use tor_hscrypto::{
    dhe::{EphemeralSecret, PublicKey},
    layers::{OnionPublicKey, OnionSecretKey},
    pk::{Ed25519Keypair, HsIdKey},
    subcredential::Subcredential,
    time::Period,
    HsBlindIdKey
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 创建和验证洋葱服务描述符
    let id_key = HsIdKey::generate();
    let period = Period::current()?;
    let blind_key = HsBlindIdKey::from_id_key(&id_key, period);
    assert!(blind_key.valid_for_id_key(&id_key, period));

    // 2. 分层加密
    let secret_key = OnionSecretKey::generate();
    let public_key = OnionPublicKey::from(&secret_key);
    let plaintext = b"secret message";
    let ciphertext = public_key.encrypt(plaintext)?;
    let decrypted = secret_key.decrypt(&ciphertext)?;
    assert_eq!(plaintext, &decrypted[..]);

    // 3. Diffie-Hellman密钥交换
    let alice_secret = EphemeralSecret::new();
    let bob_secret = EphemeralSecret::new();
    let alice_public = PublicKey::from(&alice_secret);
    let bob_public = PublicKey::from(&bob_secret);
    let alice_shared = alice_secret.diffie_hellman(&bob_public);
    let bob_shared = bob_secret.diffie_hellman(&alice_public);
    assert_eq!(alice_shared.as_bytes(), bob_shared.as_bytes());

    // 4. 创建和验证签名
    let keypair = Ed25519Keypair::generate();
    let message = b"important data";
    let signature = keypair.sign(message);
    assert!(keypair.verify(&signature, message).is_ok());

    // 5. 子凭证系统
    let subcredential = Subcredential::derive(&id_key, b"extra context");
    assert!(subcredential.verify(&id_key, b"extra context"));

    Ok(())
}

这个完整示例展示了tor-hscrypto库的主要功能,包括洋葱服务描述符、分层加密、密钥交换、数字签名和子凭证系统。

回到顶部