use rand::Rng;
use vigenere_lib::{Vigenere, VigenereBuilder};
pub struct OneTimePad;
impl OneTimePad {
pub fn encrypt(plaintext: &str) -> (String, OneTimePadDecryptor) {
let key = plaintext.chars().map(|_| rand::thread_rng().gen_range(65u8..=90u8) as char).collect::<String>();
let vigenere = Vigenere::new().key(&key).alphabet("ABCDEFGHIJKLMNOPQRSTUVWXYZ").build().unwrap();
let ciphertext = vigenere.encrypt(plaintext);
let decryptor = OneTimePadDecryptor { key };
(ciphertext, decryptor)
}
}
pub struct OneTimePadDecryptor {
key: String,
}
impl OneTimePadDecryptor {
pub fn decrypt(self, ciphertext: &str) -> String {
let vigenere = Vigenere::new().key(self.key).alphabet("ABCDEFGHIJKLMNOPQRSTUVWXYZ").build().unwrap();
vigenere.decrypt(ciphertext)
}
}