use crypto::buffer::{ReadBuffer, WriteBuffer};
use crypto::digest::Digest;
use crypto::sha2::Sha256;
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 3 {
println!("Usage: {} <string> <password> [-d]", args[0]);
return;
}
let string = &args[1];
let password = &args[2];
let decrypt = args.len() > 3 && args[3] == "-d";
let mut hasher = Sha256::new();
hasher.input_str(password);
let key = hasher.result_str()[..32].to_string();
if decrypt {
let decrypted_string = decrypt_string(string, &key);
println!("Decrypted string: {}", decrypted_string);
} else {
let encrypted_string = encrypt_string(string, &key);
println!("Encrypted string: {}", encrypted_string);
}
}
fn encrypt_string(string: &str, key: &str) -> String {
let block_size = 16;
let mut padded_string = string.to_string();
let padding_length = block_size - (string.len() % block_size);
padded_string.extend(std::iter::repeat(' ').take(padding_length));
let mut encryptor = crypto::aes::ecb_encryptor(
crypto::aes::KeySize::KeySize256,
key.as_bytes(),
crypto::blockmodes::PkcsPadding,
);
let mut encrypted_bytes = vec![0; padded_string.len()];
let mut read_buffer = crypto::buffer::RefReadBuffer::new(padded_string.as_bytes());
let mut buffer = crypto::buffer::RefWriteBuffer::new(&mut encrypted_bytes);
encryptor
.encrypt(&mut read_buffer, &mut buffer, true)
.unwrap();
hex::encode(buffer.take_read_buffer().take_remaining())
}
fn decrypt_string(encrypted_string: &str, key: &str) -> String {
let mut decryptor = crypto::aes::ecb_decryptor(
crypto::aes::KeySize::KeySize256,
key.as_bytes(),
crypto::blockmodes::NoPadding,
);
let encrypted_bytes = hex::decode(encrypted_string).unwrap();
let mut decrypted_bytes = vec![0; encrypted_bytes.len()];
let mut read_buffer = crypto::buffer::RefReadBuffer::new(&encrypted_bytes);
let mut buffer = crypto::buffer::RefWriteBuffer::new(&mut decrypted_bytes);
decryptor
.decrypt(&mut read_buffer, &mut buffer, true)
.unwrap();
String::from_utf8(buffer.take_read_buffer().take_remaining().to_vec()).unwrap()
}