75 lines
2.6 KiB
Clojure
75 lines
2.6 KiB
Clojure
(ns cipher-analytical-machine.ciphers.simple-substitution
|
|
(:require [clojure.string :as cs]
|
|
[cipher-analytical-machine.ciphers.caesar :as caesar])
|
|
(:gen-class))
|
|
|
|
(defn shuffled-numbers
|
|
"Generate the shuffled order for integer list."
|
|
[size]
|
|
(-> size
|
|
(take (range))
|
|
(shuffle)))
|
|
|
|
(defn generate-substitution-table
|
|
"Generate the map (char, int) for the substittion."
|
|
[symbols]
|
|
(->> (count symbols)
|
|
(shuffled-numbers)
|
|
(zipmap symbols)))
|
|
|
|
(defn generate-sorted-substitution-table
|
|
"Generate the map (char, int) for the substittion. BUT a value is the index of a symbol (from 0)."
|
|
[symbols]
|
|
(-> (count symbols)
|
|
(take (range))
|
|
(zipmap symbols)))
|
|
|
|
(defn find-value-in-table
|
|
"It uses the substitution table to find the value of a char or a number."
|
|
[char substitution-table]
|
|
(get substitution-table char))
|
|
|
|
(defn decrypt-by-table
|
|
"Decrypt a message by the substitution-table"
|
|
[substitution-table message]
|
|
(map (fn [char] (find-value-in-table char substitution-table)) message))
|
|
|
|
(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
|
|
(decrypt-by-table 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]
|
|
(-> message
|
|
(caesar/encrypt-message key symbols)
|
|
(encrypt-message substitution-table)))
|
|
|
|
(defn decrypt-message-by-symbol-table
|
|
"Decrypt a message using the simple substitution cipher. The function is case-insensitive. The substitution-table must be (symbols, symbols)."
|
|
[substitution-table message]
|
|
(->> message
|
|
(decrypt-by-table substitution-table)
|
|
(remove nil?)
|
|
(cs/join)))
|
|
|
|
(defn decrypt-message
|
|
"Decrypt a message using the simple substitution cipher. The function is case-insensitive. The substitution-table must be (int, symbols)."
|
|
[message substitution-table]
|
|
(let [message (cs/split message #",")]
|
|
(->> message
|
|
(map #(Integer/parseInt %))
|
|
(decrypt-message-by-symbol-table substitution-table))))
|
|
|
|
(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]
|
|
(-> message
|
|
(decrypt-message substitution-table)
|
|
(caesar/decrypt-message key symbols)))
|
|
|