@ -1,6 +1,5 @@
( ns cipher-analytical-machine.ciphers.simple-substitution
( :require [ clojure.string :as cs ]
[ clojure.set :as set ]
[ cipher-analytical-machine.ciphers.caesar :as caesar ] )
( :gen-class ) )
@ -20,28 +19,38 @@
( defn find-value-in-table
"It uses the substitution table to find the value of a char or a number."
[ char substitution-table symbols ]
[ char substitution-table ]
( get substitution-table char ) )
( defn encrypt-message
"Encrypt a message using the simple substitution cipher. The function is case-insensitive. If a symbol isn't in the symbols list, then it will be removed."
[ message substitution-table ]
( ->> message
( map ( fn [ char ] ( find-value-in-table char substitution-table ) ) )
( remove nil? )
( cs/join \, ) ) )
( defn encrypt-message-with-caesar
"Encrypt a message using the simple substitution cipher and the Caesar cipher. The function is case-insensitive. If a symbol isn't in the symbols list, then it will be removed."
[ message key substitution-table symbols ]
( let [ max-index ( count symbols ) ]
( ->> message
( cs/lower-case )
( caesar/encrypt-message key symbols )
( map ( fn [ char ] ( find-value-in-table char substitution-table symbols ) ) )
( cs/join \, ) ) ) )
( -> message
( caesar/encrypt-message key symbols )
( encrypt-message substitution-table ) ) )
( defn decrypt-message
"Decrypt a message using the simple substitution cipher. The function is case-insensitive."
"Decrypt a message using the simple substitution cipher. The function is case-insensitive. The substitution-table must be "
[ message substitution-table ]
( let [ message ( cs/split message # "," ) ]
( ->> message
( map # ( Integer/parseInt % ) )
( map ( fn [ char ] ( find-value-in-table char substitution-table ) ) )
( remove nil? )
( cs/join ) ) ) )
( defn decrypt-message-with-caesar
"Decrypt a message using the simple substitution cipher and the Caesar cipher. The function is case-insensitive."
[ message key substitution-table symbols ]
( let [ substitution-table ( set/map-invert substitution-table )
max-index ( count symbols )
message ( cs/split message # "," ) ]
( ->> message
( map # ( Integer/parseInt % ) )
( map ( fn [ char ] ( find-value-in-table char substitution-table symbols ) ) )
( caesar/encrypt-message key symbols )
( cs/join ) ) ) )
( -> message
( decrypt-message substitution-table )
( caesar/decrypt-message key symbols ) ) )