use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::time::{SystemTime, UNIX_EPOCH};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum EncryptionError {
#[error("Encryption failed: {0}")]
EncryptionFailed(String),
#[error("Decryption failed: {0}")]
DecryptionFailed(String),
#[error("Key not found: {0}")]
KeyNotFound(String),
#[error("Invalid key")]
InvalidKey,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CryptoKey {
pub id: String,
pub key_data: Vec<u8>,
pub created_at: SystemTime,
pub expires_at: Option<SystemTime>,
}
#[derive(Debug)]
pub struct KeyManager {
keys: Arc<Mutex<HashMap<String, CryptoKey>>>,
active_key_id: Arc<Mutex<String>>,
}
impl KeyManager {
pub fn new() -> Self {
let mut keys = std::collections::HashMap::new();
let master_key: _ = Self::generate_key();
let key_id: _ = "master-key-1".to_string();
keys.insert(
key_id.clone(),
CryptoKey {
id: key_id.clone(),
key_data: master_key,
created_at: SystemTime::now(),
expires_at: None,
},
);
Self {
keys: Arc::new(Mutex::new(keys)),
active_key_id: Arc::new(Mutex::new(key_id)),
}
}
fn generate_key() -> Vec<u8> {
let mut key = vec![0u8; 32];
getrandom::getrandom(&mut key).expect("Failed to generate random key");
key
}
pub async fn get_key(&self, key_id: &str) -> Result<CryptoKey, EncryptionError> {
let keys: _ = self.keys.lock().unwrap();
keys.get(key_id)
.cloned()
.ok_or_else(|| EncryptionError::KeyNotFound(key_id.to_string()))
}
pub async fn get_active_key(&self) -> Result<CryptoKey, EncryptionError> {
let active_key_id: _ = self.active_key_id.lock().unwrap();
self.get_key(&active_key_id).await
}
pub async fn rotate_keys(&self) -> Result<(), EncryptionError> {
let new_key: _ = Self::generate_key();
let new_key_id: _ = format!(
"key-{}",
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs()
);
let mut keys = self.keys.lock().unwrap();
keys.insert(
new_key_id.clone(),
CryptoKey {
id: new_key_id.clone(),
key_data: new_key,
created_at: SystemTime::now(),
expires_at: None,
},
);
let mut active_key_id = self.active_key_id.lock().unwrap();
*active_key_id = new_key_id;
Ok(())
}
pub async fn add_key(&self, key: CryptoKey) -> Result<(), EncryptionError> {
let mut keys = self.keys.lock().unwrap();
keys.insert(key.id.clone(), key);
Ok(())
}
pub async fn revoke_key(&self, key_id: &str) -> Result<(), EncryptionError> {
let mut keys = self.keys.lock().unwrap();
keys.remove(key_id);
Ok(())
}
}
#[derive(Debug)]
pub struct EncryptionEngine {
key_manager: Arc<KeyManager>,
}
impl EncryptionEngine {
pub fn new() -> Self {
Self {
key_manager: Arc::new(KeyManager::new()),
}
}
pub async fn encrypt(&self, data: &[u8]) -> Result<Vec<u8>, EncryptionError> {
let key: _ = self.key_manager.get_active_key().await?;
let encrypted: _ = data
.iter()
.zip(key.key_data.iter().cycle())
.map(|(d, k)| d ^ k)
.collect();
Ok(encrypted)
}
pub async fn decrypt(&self, encrypted_data: &[u8]) -> Result<Vec<u8>, EncryptionError> {
let key: _ = self.key_manager.get_active_key().await?;
let decrypted: _ = encrypted_data
.iter()
.zip(key.key_data.iter().cycle())
.map(|(e, k)| e ^ k)
.collect();
Ok(decrypted)
}
pub async fn encrypt_with_key(
&self,
data: &[u8],
key_id: &str,
) -> Result<Vec<u8>, EncryptionError> {
let key: _ = self.key_manager.get_key(key_id).await?;
let encrypted: _ = data
.iter()
.zip(key.key_data.iter().cycle())
.map(|(d, k)| d ^ k)
.collect();
Ok(encrypted)
}
pub async fn decrypt_with_key(
&self,
encrypted_data: &[u8],
key_id: &str,
) -> Result<Vec<u8>, EncryptionError> {
let key: _ = self.key_manager.get_key(key_id).await?;
let decrypted: _ = encrypted_data
.iter()
.zip(key.key_data.iter().cycle())
.map(|(e, k)| e ^ k)
.collect();
Ok(decrypted)
}
pub fn get_key_manager(&self) -> Arc<KeyManager> {
self.key_manager.clone()
}
pub async fn test_performance(&self, data_size: usize) -> Result<f64, EncryptionError> {
let test_data: _ = vec![0u8; data_size];
let start: _ = std::time::Instant::now();
let encrypted: _ = self.encrypt(&test_data).await?;
let elapsed: _ = start.elapsed();
let bytes_per_second: _ = data_size as f64 / elapsed.as_secs_f64();
if encrypted.is_empty() {
return Err(EncryptionError::EncryptionFailed("加密失败".to_string()));
}
Ok(bytes_per_second)
}
}
impl Default for KeyManager {
fn default() -> Self {
Self::new()
}
}
impl Default for EncryptionEngine {
fn default() -> Self {
Self::new()
}
}