use self_crypto_key::{init_key_storage, KeyStore};
use std::env;
init_key_storage!();
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
print_usage(&args[0]);
return Ok(());
}
match args[1].as_str() {
"init" => {
println!("初始化密钥存储...");
let mut store = KeyStore::new()?;
let random_key = KeyStore::generate_random_key(32);
store.update(&random_key)?;
println!("✓ 密钥已初始化: {}", random_key);
println!(" (密钥已分散加密存储在多个section中)");
}
"show" => {
let store = KeyStore::new()?;
match store.read() {
Ok(key) => {
if key.is_empty() {
println!("密钥未初始化,请先运行: {} init", args[0]);
} else {
println!("当前密钥: {}", key);
println!("密钥长度: {} 字节", key.len());
}
}
Err(e) => {
eprintln!("读取密钥失败: {}", e);
eprintln!("提示: 可能需要先运行 {} init", args[0]);
}
}
}
"show-bytes" => {
let store = KeyStore::new()?;
match store.read_bytes() {
Ok(bytes) => {
if bytes.is_empty() {
println!("密钥未初始化,请先运行: {} init", args[0]);
} else {
println!("当前密钥 (bytes): {:?}", bytes);
println!("密钥长度: {} 字节", bytes.len());
if let Ok(s) = String::from_utf8(bytes.clone()) {
println!("密钥 (string): {}", s);
}
}
}
Err(e) => {
eprintln!("读取密钥失败: {}", e);
}
}
}
"update" => {
if args.len() < 3 {
eprintln!("用法: {} update <新密钥>", args[0]);
return Ok(());
}
let new_key = &args[2];
let mut store = KeyStore::new()?;
store.update(new_key)?;
println!("✓ 密钥已更新为: {}", new_key);
}
"update-bytes" => {
if args.len() < 3 {
eprintln!("用法: {} update-bytes <hex字符串>", args[0]);
eprintln!("示例: {} update-bytes 48656c6c6f", args[0]);
return Ok(());
}
let hex_str = &args[2];
if hex_str.len() % 2 != 0 {
eprintln!("错误: hex字符串长度必须是偶数");
return Ok(());
}
let bytes: Result<Vec<u8>, _> = (0..hex_str.len())
.step_by(2)
.map(|i| u8::from_str_radix(&hex_str[i..i + 2], 16))
.collect();
match bytes {
Ok(bytes) => {
let mut store = KeyStore::new()?;
store.update_bytes(&bytes)?;
println!("✓ 密钥已更新 (bytes): {:?}", bytes);
println!(" 长度: {} 字节", bytes.len());
}
Err(e) => {
eprintln!("错误: 无效的hex字符串: {}", e);
}
}
}
"random" => {
let length = if args.len() >= 3 {
args[2].parse().unwrap_or(32)
} else {
32
};
let mut store = KeyStore::new()?;
let capacity = store.capacity();
if length > capacity {
eprintln!("错误: 密钥长度({})不能超过总容量({})", length, capacity);
return Ok(());
}
let random_key = KeyStore::generate_random_key(length);
store.update(&random_key)?;
println!("✓ 已生成并设置随机密钥: {}", random_key);
println!(" 长度: {} 字节", length);
}
"random-bytes" => {
let length = if args.len() >= 3 {
args[2].parse().unwrap_or(32)
} else {
32
};
let mut store = KeyStore::new()?;
let capacity = store.capacity();
if length > capacity {
eprintln!("错误: 密钥长度({})不能超过总容量({})", length, capacity);
return Ok(());
}
let random_bytes = KeyStore::generate_random_bytes(length);
store.update_bytes(&random_bytes)?;
println!("✓ 已生成并设置随机bytes: {:?}", random_bytes);
println!(" 长度: {} 字节", length);
}
"info" => {
let store = KeyStore::new()?;
println!("密钥存储信息:");
println!(" 总容量: {} 字节 (8KB)", store.capacity());
println!(" 加密方式: 基于 .text 代码段哈希的分散加密");
println!(" 支持类型: String 和 Bytes");
println!();
println!("安全特性:");
println!(" - 密钥分散存储在 4-8 个随机选择的 sections 中");
println!(" - 每个片段使用 .text 段的 SHA256 哈希加密");
println!(" - 应用多层混淆(位反转、字节置换、异或)");
println!(" - 只有完整且未修改的程序才能正确恢复密钥");
println!();
println!("Section命名:");
println!(" - 数据sections: .key_data_00 到 .key_data_07");
println!(" - 元数据section: .key_meta");
}
"capacity" => {
let store = KeyStore::new()?;
println!("总容量: {} 字节", store.capacity());
}
_ => {
print_usage(&args[0]);
}
}
Ok(())
}
fn print_usage(program: &str) {
println!("Self Crypto Key - 自修改密钥存储示例\n");
println!("用法:");
println!(
" {} init - 初始化并生成随机密钥",
program
);
println!(" {} show - 显示当前密钥", program);
println!(
" {} show-bytes - 显示当前密钥(bytes)",
program
);
println!(" {} update <密钥> - 更新为指定密钥", program);
println!(
" {} update-bytes <hex> - 更新为指定bytes(hex)",
program
);
println!(" {} random [长度] - 生成并设置随机密钥", program);
println!(
" {} random-bytes [长度] - 生成并设置随机bytes",
program
);
println!(" {} info - 显示密钥存储信息", program);
println!(" {} capacity - 显示总容量", program);
println!();
println!("示例:");
println!(" {} init", program);
println!(" {} show", program);
println!(" {} update my-secret-key-123", program);
println!(" {} update-bytes 48656c6c6f", program);
println!(" {} random 64", program);
println!(" {} random-bytes 128", program);
}