use crate::crypto_systems::vigenere::Vigenere;
use crate::error::VigenereError;
use crate::prelude::ALPHABET_LEN;
use crate::utils::{decode_digit, encode_char, BaseString, EncodedString, StringType};
use crate::Traits::{Decrypt, Encrypt};
use rayon::prelude::*;
impl Decrypt<VigenereError, BaseString, BaseString> for Vigenere {
fn decrypt(&self, input: BaseString) -> Result<BaseString, VigenereError> {
let encoded = input.encode()?;
let key_cycle: Vec<_> = self
.key
.data
.iter()
.cycle()
.take(encoded.data.len())
.copied()
.collect();
let decrypted_data: Vec<_> = encoded
.par_iter()
.zip(key_cycle.par_iter()) .map(|(&x, &y)| (*ALPHABET_LEN + x - y) % *ALPHABET_LEN) .collect();
let decrypted_data = EncodedString::new(decrypted_data, StringType::Standard).decode()?;
Ok(decrypted_data)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decrypts_input_correctly() {
let vigenere = Vigenere::new("hello".to_string());
let result = vigenere.decrypt("oixxa".into());
assert!(result.is_ok());
assert_eq!(result.unwrap(), "hello".into()); }
}