Skip to main content

kcptun_rust/
crypt.rs

1use anyhow::Result;
2use pbkdf2::pbkdf2_hmac;
3use rust_tokio_kcp::NoneBlockCrypt;
4use sha1::Sha1;
5use std::sync::Arc;
6
7pub use rust_tokio_kcp::BlockCrypt;
8
9pub const SALT: &[u8] = b"kcp-go";
10
11/// 从密码派生密钥
12pub fn derive_key(password: &str) -> Vec<u8> {
13    let mut key = vec![0u8; 32];
14    pbkdf2_hmac::<Sha1>(password.as_bytes(), SALT, 4096, &mut key);
15    key
16}
17
18/// 根据加密算法名称和密钥创建加密器
19pub fn create_block_crypt(crypt: &str, key: &[u8]) -> Result<Option<Arc<dyn BlockCrypt>>> {
20    match crypt.to_lowercase().as_str() {
21        "auto" => {
22            Ok(None)
23        }
24
25        "none" => {
26            // 不加密
27            let crypt = NoneBlockCrypt::new(b"dummy_key").map_err(|e| anyhow::anyhow!("Failed to create None: {}", e))?;
28            Ok(Some(crypt))
29        }
30        "aes" | "aes-128" => {
31            let crypt = rust_tokio_kcp::Aes128BlockCrypt::new(&key[..16])
32                .map_err(|e| anyhow::anyhow!("Failed to create AES-128: {}", e))?;
33            Ok(Some(Arc::new(crypt)))
34        }
35        "aes-192" => {
36            let crypt = rust_tokio_kcp::Aes192BlockCrypt::new(&key[..24])
37                .map_err(|e| anyhow::anyhow!("Failed to create AES-192: {}", e))?;
38            Ok(Some(Arc::new(crypt)))
39        }
40        "aes-256" => {
41            let crypt = rust_tokio_kcp::Aes256BlockCrypt::new(&key[..32])
42                .map_err(|e| anyhow::anyhow!("Failed to create AES-256: {}", e))?;
43            Ok(Some(Arc::new(crypt)))
44        }
45        "tea" => {
46            let crypt = rust_tokio_kcp::TeaBlockCrypt::new(&key[..16])
47                .map_err(|e| anyhow::anyhow!("Failed to create TEA: {}", e))?;
48            Ok(Some(Arc::new(crypt)))
49        }
50        "xtea" => {
51            let crypt = rust_tokio_kcp::XteaBlockCrypt::new(&key[..16])
52                .map_err(|e| anyhow::anyhow!("Failed to create XTEA: {}", e))?;
53            Ok(Some(Arc::new(crypt)))
54        }
55        "xor" | "simple_xor" => {
56            let crypt = rust_tokio_kcp::SimpleXorBlockCrypt::new(key)
57                .map_err(|e| anyhow::anyhow!("Failed to create SimpleXOR: {}", e))?;
58            Ok(Some(Arc::new(crypt)))
59        }
60        "blowfish" => {
61            let crypt = rust_tokio_kcp::BlowfishBlockCrypt::new(key)
62                .map_err(|e| anyhow::anyhow!("Failed to create Blowfish: {}", e))?;
63            Ok(Some(Arc::new(crypt)))
64        }
65        "cast5" => {
66            let crypt = rust_tokio_kcp::Cast5BlockCrypt::new(&key[..16])
67                .map_err(|e| anyhow::anyhow!("Failed to create CAST5: {}", e))?;
68            Ok(Some(Arc::new(crypt)))
69        }
70        "3des" | "triple_des" => {
71            let crypt = rust_tokio_kcp::TripleDesBlockCrypt::new(&key[..24])
72                .map_err(|e| anyhow::anyhow!("Failed to create 3DES: {}", e))?;
73            Ok(Some(Arc::new(crypt)))
74        }
75        "twofish" => {
76            let crypt = rust_tokio_kcp::TwofishBlockCrypt::new(key)
77                .map_err(|e| anyhow::anyhow!("Failed to create Twofish: {}", e))?;
78            Ok(Some(Arc::new(crypt)))
79        }
80        "salsa20" => {
81            let crypt = rust_tokio_kcp::Salsa20BlockCrypt::new(key)
82                .map_err(|e| anyhow::anyhow!("Failed to create Salsa20: {}", e))?;
83            Ok(Some(Arc::new(crypt)))
84        }
85        "sm4" => {
86            let crypt = rust_tokio_kcp::Sm4BlockCrypt::new(&key[..16])
87                .map_err(|e| anyhow::anyhow!("Failed to create SM4: {}", e))?;
88            Ok(Some(Arc::new(crypt)))
89        }
90        "aes-128-gcm" => {
91            let crypt = rust_tokio_kcp::AesGcmBlockCrypt::new(&key[..16])
92                .map_err(|e| anyhow::anyhow!("Failed to create AES-128-GCM: {}", e))?;
93            Ok(Some(Arc::new(crypt)))
94        }
95        _ => {
96            match key.len(){
97                16 => {
98                    let crypt = rust_tokio_kcp::Aes128BlockCrypt::new(&key[..16])
99                        .map_err(|e| anyhow::anyhow!("Failed to create AES-128: {}", e))?;
100                    Ok(Some(Arc::new(crypt)))
101                }
102                24 => {
103                    let crypt = rust_tokio_kcp::Aes192BlockCrypt::new(&key[..24])
104                        .map_err(|e| anyhow::anyhow!("Failed to create AES-192: {}", e))?;
105                    Ok(Some(Arc::new(crypt)))
106                }
107                32 => {
108                    let crypt = rust_tokio_kcp::Aes256BlockCrypt::new(&key[..32])
109                        .map_err(|e| anyhow::anyhow!("Failed to create AES-256: {}", e))?;
110                    Ok(Some(Arc::new(crypt)))
111                }
112                _ => {
113                    anyhow::bail!("Unsupported key length: {}", key.len())
114                }
115            }
116            //anyhow::bail!("Unsupported encryption algorithm: {}", crypt)
117        }
118    }
119}