use crate::{Cipher, CipherResult, ColumnarTransposition, PolybiusSquare};
pub struct ADFGX {
key: String,
keyword: String,
}
impl ADFGX {
pub fn new(key: &str, keyword: &str) -> Self {
assert_eq!(key.len(), 25, "`key` must be 25 chars in length");
Self {
key: String::from(key),
keyword: String::from(keyword),
}
}
}
impl Cipher for ADFGX {
fn encipher(&self, ptext: &str) -> CipherResult {
let ps = PolybiusSquare::new(&self.key, "ADFGX");
let ct = ColumnarTransposition::new(&self.keyword);
ct.encipher(&ps.encipher(ptext)?)
}
fn decipher(&self, ctext: &str) -> CipherResult {
let ps = PolybiusSquare::new(&self.key, "ADFGX");
let ct = ColumnarTransposition::new(&self.keyword);
ps.decipher(&ct.decipher(ctext)?)
}
}