#aes #rsa #encryption #p2p #sllp

networking

以点对点方式实现的加密 RSA + AES 网络实现

11 个版本

0.1.9 2020 年 8 月 13 日
0.1.8 2020 年 8 月 2 日
0.1.6 2020 年 7 月 28 日

#25 in #rsa


用于 4 crates

MIT 许可证

130KB
3K SLoC

点对点 TLS

用途

该网络旨在提供使用 RSA 的安全 AES 非对称实现,它被设计为名为 Artifice 的分布式人工智能训练平台的网络层。目前,这个 crate 是 Artifice 项目中进展最远的。

与经典 TLS 的区别

此 crate 旨在通过加密每个数据包中发送的预共享密钥来防止中间人攻击。通过这种方式,即使黑客拥有公钥,也无法提供可能导致任何一方崩溃的虚假信息。这样,每个节点都可以在两个方向上维持对其他节点的了解,这比传统的 TLS 更具去中心化。

版本详情

此版本是之前版本的补丁,修复了数据包在 TCP 中的合并问题以及数据包解密。它还提供了更高效的 AES 使用方式,即每个数据包而不是每次会话使用一个新的 AES 密钥,至少提高了 4 倍的加密速度。此版本还提供了根据 NIC 的 MTU 对数据进行分片补丁。

联系我们

此 crate 是一个更大项目的基石,因此将其提交到 crates.io 只是为了测试,因此请不要犹豫,提交错误报告或使用以下电子邮件。

电子邮件: [email protected]

SLLP 的实现

此项目中的 SLLP 实现通过验证加密的预共享密钥确保了两个节点之间的伪连接是私密的。这样做是为了在不需要精确度的情况下快速传输大量数据。

未来实现

  • 为 SLLP 正确处理错误以通知流连接已终止。
  • 跟踪数据顺序,用于 SLLP。
  • 通过发送长度为 65535 字节的数据块来传输超过 65535 字节的数据,对于 TCP 实现。
  • 增加数据包类型,目前只有原始数据包和行政数据包类型,请参见协议。

示例用法

数据库使用

use networking::database::HashDatabase;
use networking::ArtificePeer;
use networking::{random_string, test_config};

fn main(){
   // generate aes encryption key
   let key = random_string(16).into_bytes();
   let (peer, _config) = test_config();
   
   let mut database: HashDatabase<ArtificePeer> = HashDatabase::new("./test_db", key.clone()).unwrap();
   database.insert(peer.global_peer_hash().to_string(), peer.clone()).unwrap();
   
   let mut second_database: HashDatabase<ArtificePeer> = HashDatabase::new("./test_db", key).unwrap();
   second_database.load(&peer.global_peer_hash().to_string()).unwrap();
   let newpeer = second_database.get(&peer.global_peer_hash().to_string()).unwrap();
}

异步

依赖

tokio = {version = "0.2.21", features = ["full"]}

异步客户端

use networking::{asyncronous::{AsyncHost, AsyncRecv}, test_config};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
   let (peer, config) = test_config();
   let host = AsyncHost::client_only(&config).await.unwrap();
   let mut stream = host.connect(peer).await.unwrap();
   let mut buffer = Vec::new();
   println!(
       "got {} bytes from server",
       stream.recv(&mut buffer).await.unwrap()
   );
   let string = String::from_utf8(buffer).unwrap();
   println!("got message: {} from server", string);
   Ok(())
}

异步服务器

use networking::{asyncronous::{AsyncHost, AsyncSend, AsyncNetworkHost}, test_config};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let (peer, config) = test_config();
    let mut host = AsyncHost::from_host_config(&config).await.unwrap();
    while let Some(Ok(strm)) = host.incoming()?.await {
        let mut stream = strm.verify(&peer)?;
        // make sure you got a connection from the correct peer
        println!("sending message hello world");
        stream.send(b"hello world").await.unwrap();
    }
    Ok(())
}

同步

有关同步示例和sllp示例,请参阅文档。相机示例用于展示实际应用,并通过提供高负载来测试网络。

依赖

~16–27MB
~403K SLoC