-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathvsa_cipher.clj
100 lines (77 loc) · 2.77 KB
/
vsa_cipher.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
(ns vsa-cipher
(:require
[gigasquid.image :as image]
[gigasquid.vsa-base :as vb]
[gigasquid.vsa-data :as vd]))
(def alphabet
[:a :b :c :d :e :f :g :h :i :j :k :l :m :n :o :p :q :r :s :t :u :v :w :x :y :z :end-of-message])
(def max-num 4)
(def numbers (range 1 (inc max-num)))
(def key-codes (into alphabet numbers))
(defn add-keys-to-cleanup-mem!
"Take a single hdv as a seed and create an alphabet + numbers of them by using rotation/ protect"
[seed-hdv]
(vb/reset-hdv-mem!)
(doall
(reduce (fn [v k]
(let [nv (vb/protect v)]
(vb/add-hdv! k nv)
nv))
seed-hdv
key-codes)))
(defn encode-message
"Encode a message using key value pairs with numbers for ordering"
[message]
(when (> (count message) max-num)
(throw (ex-info "message too long" {:allowed-n max-num})))
(let [ds (zipmap numbers
(conj (->> (mapv str message)
(mapv keyword))
:end-of-message))]
(println "Encoding " message " into " ds)
(vd/clj->vsa ds)))
(defn decode-message
"Decode a message by getting the value of the numbered pairs"
[msg]
(let [message-v (reduce (fn [res x]
(conj res (first (vd/vsa-get msg x))))
[]
numbers)
_ (println "decoded message-v " message-v)
decoded (->> message-v
(partition-by #(= % :end-of-message))
first
(mapv #(if (keyword? %)
(name %)
(str %)))
(apply str))]
(println "Decoded message is " decoded)
decoded))
(comment
(vb/set-size! 1e4)
(def seed-key-hdv (vb/hdv))
(add-keys-to-cleanup-mem! seed-key-hdv)
(image/write-image-hdv "seed-key-hdv" seed-key-hdv)
(def message (encode-message "cats"))
(image/write-image-hdv "secret-message" message)
(decode-message message)
;=> "cats"
;;; reload the keys
(add-keys-to-cleanup-mem! seed-key-hdv)
(decode-message message)
;=> "cats"
;; Now loading up from the picture of the seed-key-hdv
(def loaded-key (image/read-image-to-hdv "examples/seed-key-hdv.png"))
(add-keys-to-cleanup-mem! loaded-key)
(decode-message message)
;=> "cats"
;;; Now loading up the from the picture of the encoded message
(def loaded-message (image/read-image-to-hdv "examples/secret-message.png"))
(decode-message loaded-message)
;;=> "cats"
;;; Loading from file both
(def loaded-key (image/read-image-to-hdv "examples/seed-key-hdv.png"))
(add-keys-to-cleanup-mem! loaded-key)
(def loaded-message (image/read-image-to-hdv "examples/secret-message.png"))
(decode-message loaded-message)
)