ferric_crypto_lib 0.2.7

A library for Ferric Crypto
Documentation
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()) // Use a parallel iterator of the key cycle
            .map(|(&x, &y)| (*ALPHABET_LEN + x - y) % *ALPHABET_LEN) // perform decryption
            .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()); // replace with expected encrypted string
    }
}