Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2616b14ef4 | ||
|
|
a5e148f0b7 | ||
|
|
dad9bf045c | ||
|
|
f9ddae3998 | ||
|
|
31d2e8f753 | ||
|
|
60907c9a3b |
+134
-1
@@ -7,6 +7,120 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.9.12] - 2023-11-20
|
||||||
|
- Update the CHANGELOG.
|
||||||
|
- Update the version.
|
||||||
|
- Update the README.
|
||||||
|
|
||||||
|
## [0.9.11] - 2023-11-14
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add the function that return all key combinations for a possible key vector.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Rename the function from get-possible-keys to get-all-combinations-for-blocks.
|
||||||
|
|
||||||
|
## [0.9.10] - 2023-11-13
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add a function to get all permutations for a block.
|
||||||
|
|
||||||
|
## [0.9.9] - 2023-11-12
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add a function to convert a count map to a reversed map.
|
||||||
|
- Add a function to get the ordered sequence that can form a key.
|
||||||
|
|
||||||
|
## [0.9.8] - 2023-11-11
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add functions to get possible keys.
|
||||||
|
|
||||||
|
## [0.9.7] - 2023-11-03
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add the default frequency factory.
|
||||||
|
|
||||||
|
## [0.9.6] - 2023-11-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add int-string? to check if a string is a number.
|
||||||
|
- Add key? to check if a string is a gamma key.
|
||||||
|
- Add key validation for Caesar and Gamma ciphers.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Rename unsigned-int? to unsigned-int-string?
|
||||||
|
|
||||||
|
## [0.9.5] - 2023-10-31
|
||||||
|
## [0.9.5] - 2023-10-31
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add the option for the gamma cipher.
|
||||||
|
|
||||||
|
## [0.9.4] - 2023-10-31
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix the key parsing in the gamma actions.
|
||||||
|
|
||||||
|
## [0.9.3] - 2023-10-31
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add the action of encryption for the gamma cipher.
|
||||||
|
- Add the action of decryption for the gamma cipher.
|
||||||
|
|
||||||
|
## [0.9.2] - 2023-10-29
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add a function to encrypt a message with the gamma cipher.
|
||||||
|
- Add a function to decrypt a message with the gamma cipher.
|
||||||
|
|
||||||
|
## [0.9.1] - 2023-10-28
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Refactor the simple substitute to use the decrypt-by-table function.
|
||||||
|
|
||||||
|
## [0.9.0] - 2023-10-27
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add the gamma generator.
|
||||||
|
- Add the functions to encrypt and decrypt with the gamma cipher.
|
||||||
|
|
||||||
|
## [0.8.5] - 2023-10-25
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add the main for the cli module.
|
||||||
|
|
||||||
|
## [0.8.4] - 2023-10-24
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Update the simple substitution cipher to split the decrypt-message.
|
||||||
|
|
||||||
|
## [0.8.3] - 2023-10-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add functions to make a frequency map.
|
||||||
|
|
||||||
|
## [0.8.2] - 2023-10-23
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add a function to invert the table in a decoded json.
|
||||||
|
- Add the parser to parse the string as an integer if it's needed.
|
||||||
|
- Add the simple substitution cipher.
|
||||||
|
|
||||||
|
## [0.8.1] - 2023-10-22
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add a generator for the sorted substitution table.
|
||||||
|
- Add the parsers to parse keys.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Update the simple substitution cipher to split the functions.
|
||||||
|
|
||||||
|
## [0.8.0] - 2023-10-21
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add the simple substitution cipher.
|
||||||
|
|
||||||
## [0.7.2] - 2023-10-21
|
## [0.7.2] - 2023-10-21
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
@@ -177,7 +291,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Added
|
### Added
|
||||||
- Project initialization.
|
- Project initialization.
|
||||||
|
|
||||||
[Unreleased]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.7.2...main?from_project_id=50218541&straight=false
|
[Unreleased]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.12...main?from_project_id=50218541&straight=false
|
||||||
|
[0.9.12]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.11...0.0.9.12?from_project_id=50218541&straight=false
|
||||||
|
[0.9.11]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.10...0.0.9.11?from_project_id=50218541&straight=false
|
||||||
|
[0.9.10]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.9...0.9.10?from_project_id=50218541&straight=false
|
||||||
|
[0.9.9]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.8...0.9.9?from_project_id=50218541&straight=false
|
||||||
|
[0.9.8]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.7...0.9.8?from_project_id=50218541&straight=false
|
||||||
|
[0.9.7]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.6...0.9.7?from_project_id=50218541&straight=false
|
||||||
|
[0.9.6]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.5...0.9.6?from_project_id=50218541&straight=false
|
||||||
|
[0.9.5]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.4...0.9.5?from_project_id=50218541&straight=false
|
||||||
|
[0.9.4]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.3...0.9.4?from_project_id=50218541&straight=false
|
||||||
|
[0.9.3]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.2...0.9.3?from_project_id=50218541&straight=false
|
||||||
|
[0.9.2]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.1...0.9.2?from_project_id=50218541&straight=false
|
||||||
|
[0.9.1]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.9.0...0.9.1?from_project_id=50218541&straight=false
|
||||||
|
[0.9.0]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.8.5...0.9.0?from_project_id=50218541&straight=false
|
||||||
|
[0.8.5]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.8.4...0.8.5?from_project_id=50218541&straight=false
|
||||||
|
[0.8.4]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.8.3...0.8.4?from_project_id=50218541&straight=false
|
||||||
|
[0.8.3]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.8.2...0.8.3?from_project_id=50218541&straight=false
|
||||||
|
[0.8.2]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.8.1...0.8.2?from_project_id=50218541&straight=false
|
||||||
|
[0.8.1]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.8.0...0.8.1?from_project_id=50218541&straight=false
|
||||||
|
[0.8.0]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.7.2...0.8.0?from_project_id=50218541&straight=false
|
||||||
[0.7.2]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.7.1...0.7.2?from_project_id=50218541&straight=false
|
[0.7.2]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.7.1...0.7.2?from_project_id=50218541&straight=false
|
||||||
[0.7.1]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.7.0...0.7.1?from_project_id=50218541&straight=false
|
[0.7.1]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.7.0...0.7.1?from_project_id=50218541&straight=false
|
||||||
[0.7.0]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.6.3...0.7.0?from_project_id=50218541&straight=false
|
[0.7.0]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.6.3...0.7.0?from_project_id=50218541&straight=false
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ You need install java, before run the application.
|
|||||||
Run the application with a command:
|
Run the application with a command:
|
||||||
|
|
||||||
$ java -jar cipher-analytical-machine-VERSION-standalone.jar [args]
|
$ java -jar cipher-analytical-machine-VERSION-standalone.jar [args]
|
||||||
$ java -jar cipher-analytical-machine-0.7.2-standalone.jar [args]
|
$ java -jar cipher-analytical-machine-0.9.12-standalone.jar [args]
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
(defproject cipher-analytical-machine "0.7.2"
|
(defproject cipher-analytical-machine "0.9.12"
|
||||||
:description "A program helps to learn how ciphers works."
|
:description "A program helps to learn how ciphers works."
|
||||||
:url "https://gitlab.com/KKlochko/cipher-analytical-machine"
|
:url "https://gitlab.com/KKlochko/cipher-analytical-machine"
|
||||||
:license {:name "LGPL"
|
:license {:name "LGPL"
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
(ns cipher-analytical-machine.analyzers.simple-substitution
|
(ns cipher-analytical-machine.analyzers.simple-substitution
|
||||||
(:require [clojure.string :as cs]
|
(:require [clojure.string :as cs]
|
||||||
[clojure.math.combinatorics :as comb]
|
[clojure.math.combinatorics :as comb]
|
||||||
|
[cipher-analytical-machine.symbols.frequencies :as frequencies]
|
||||||
[cipher-analytical-machine.ciphers.simple-substitution :as ss]
|
[cipher-analytical-machine.ciphers.simple-substitution :as ss]
|
||||||
[cipher-analytical-machine.analyzers.analyzers :as analyzers]
|
[cipher-analytical-machine.analyzers.analyzers :as analyzers]
|
||||||
|
[cipher-analytical-machine.analyzers.analyzers :as ca]
|
||||||
[cipher-analytical-machine.analyzers.caesar :as caesar])
|
[cipher-analytical-machine.analyzers.caesar :as caesar])
|
||||||
(:gen-class))
|
(:gen-class))
|
||||||
|
|
||||||
@@ -42,3 +44,35 @@
|
|||||||
(->> (map get-all-permutation-for-block possible-key-vector)
|
(->> (map get-all-permutation-for-block possible-key-vector)
|
||||||
(get-all-combinations-for-blocks)))
|
(get-all-combinations-for-blocks)))
|
||||||
|
|
||||||
|
(defn get-possible-keys
|
||||||
|
"Return keys for a cipher text. A key is a map {\\a \\e, ...} to decrypt a text."
|
||||||
|
[cipher-text frequency-table]
|
||||||
|
(let [freq-symbol-str (frequencies/map-to-string frequency-table) ; "etaoinsrhldcumfpgwybvkxjqz"
|
||||||
|
char-map (-> (analyzers/count-characters cipher-text)
|
||||||
|
(analyzers/reverse-count-characters))]
|
||||||
|
(map (fn [comb] (zipmap comb freq-symbol-str))
|
||||||
|
(-> (get-possible-key-vector-from-reversed-count-map char-map)
|
||||||
|
(get-possible-key-combinations)))))
|
||||||
|
|
||||||
|
|
||||||
|
(defn get-plain-data
|
||||||
|
"Return the plain data (score, text, key) from a ciphertext (a string of character). The function is case-insensitive."
|
||||||
|
[cipher-text letter-frequencies]
|
||||||
|
(let [cipher-text (cs/lower-case cipher-text)
|
||||||
|
keys (get-possible-keys cipher-text letter-frequencies)]
|
||||||
|
(->> (map (fn [key] [(ss/decrypt-message-by-symbol-table key cipher-text) key]) keys)
|
||||||
|
(map (fn [[text key]] [(ca/chi-squared-statistic text letter-frequencies) text key]))
|
||||||
|
)))
|
||||||
|
|
||||||
|
(defn get-plaintext-and-key
|
||||||
|
"Return the possible plaintext from a ciphertext that encoded with numbers. The function is case-insensitive."
|
||||||
|
[cipher-text letter-frequencies]
|
||||||
|
(let [maybe-key (->> (frequencies/map-to-string letter-frequencies)
|
||||||
|
(ss/generate-sorted-substitution-table))
|
||||||
|
cipher-text (->> (cs/split cipher-text #",")
|
||||||
|
(map #(Integer/parseInt %))
|
||||||
|
(ss/decrypt-message-by-symbol-table maybe-key))]
|
||||||
|
|
||||||
|
(->> (get-plain-data cipher-text letter-frequencies)
|
||||||
|
(map (fn [el] (drop 1 el)) ))))
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
(ns cipher-analytical-machine.cli.actions.cracking
|
(ns cipher-analytical-machine.cli.actions.cracking
|
||||||
(:require
|
(:require
|
||||||
[cipher-analytical-machine.analyzers.caesar :as caesar-analyzers]
|
[cipher-analytical-machine.analyzers.caesar :as caesar-analyzers]
|
||||||
|
[cipher-analytical-machine.analyzers.simple-substitution :as ss-analyzers]
|
||||||
[cipher-analytical-machine.symbols.frequencies :as symbol-frequencies])
|
[cipher-analytical-machine.symbols.frequencies :as symbol-frequencies])
|
||||||
(:gen-class))
|
(:gen-class))
|
||||||
|
|
||||||
@@ -18,10 +19,27 @@
|
|||||||
:else
|
:else
|
||||||
(caesar-analyzers/get-plaintext message symbols frequencies))))
|
(caesar-analyzers/get-plaintext message symbols frequencies))))
|
||||||
|
|
||||||
|
(defn cracking-simple-substitution-with-caesar
|
||||||
|
[options arguments]
|
||||||
|
(let [analyzer (:analyzer options)
|
||||||
|
message (:message options)
|
||||||
|
symbols (:symbols options)
|
||||||
|
frequencies (-> (get options :language "en")
|
||||||
|
(symbol-frequencies/default-frequency-factory))]
|
||||||
|
(cond
|
||||||
|
(= analyzer "Chi^2")
|
||||||
|
(ss-analyzers/get-plaintext-and-key message frequencies)
|
||||||
|
|
||||||
|
:else
|
||||||
|
(ss-analyzers/get-plaintext-and-key message frequencies))))
|
||||||
|
|
||||||
(defn cracking-actions
|
(defn cracking-actions
|
||||||
[options arguments action-type]
|
[options arguments action-type]
|
||||||
(let [cipher (:cipher options)]
|
(let [cipher (:cipher options)]
|
||||||
(cond
|
(cond
|
||||||
(= cipher "Caesar")
|
(= cipher "Caesar")
|
||||||
(cracking-caesar options arguments))))
|
(cracking-caesar options arguments)
|
||||||
|
|
||||||
|
(= cipher "Simple substitution and Caesar")
|
||||||
|
(cracking-simple-substitution-with-caesar options arguments))))
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,8 @@
|
|||||||
(option-values-as-row "Ciphers" cipher-options))
|
(option-values-as-row "Ciphers" cipher-options))
|
||||||
|
|
||||||
(def analyzers-options
|
(def analyzers-options
|
||||||
{"Caesar" #{"Chi^2"}})
|
{"Caesar" #{"Chi^2" "Frequency"}
|
||||||
|
"Simple substitution and Caesar" #{"Chi^2" "Frequency"}})
|
||||||
|
|
||||||
(defn get-available-analyzers-options-as-string
|
(defn get-available-analyzers-options-as-string
|
||||||
"Return the formatted string of analyzers options."
|
"Return the formatted string of analyzers options."
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
[clojure.test :refer :all]
|
[clojure.test :refer :all]
|
||||||
[cipher-analytical-machine.symbols.frequencies :refer :all]))
|
[cipher-analytical-machine.symbols.frequencies :refer :all]))
|
||||||
|
|
||||||
(deftest calculate-char-index-test
|
(deftest map-to-string-test
|
||||||
(let [symbol-map english-letter-frequencies]
|
(let [symbol-map english-letter-frequencies]
|
||||||
(testing "The map must be converted to 'etaoinsrhldcumfpgwybvkxjqz'"
|
(testing "The map must be converted to 'etaoinsrhldcumfpgwybvkxjqz'"
|
||||||
(is (= "etaoinsrhldcumfpgwybvkxjqz"
|
(is (= "etaoinsrhldcumfpgwybvkxjqz"
|
||||||
|
|||||||
Reference in New Issue
Block a user