【新月実装】需【Clojure・ClojureScript】

af4e5fd5 :Anonymous 2016-01-15 15:40
@markdown
とりあえず今日の成果。次の書き込みのsignを生成できました。あとは署名機能に関しては面倒くさいことはなにもないはず…

http://saku.nakayuki.net:8000/server.cgi/get/thread_E38386E382B9E38388/1452747955

```clojure
(let [record-body "body:test"
target (digest/md5 record-body)
md5-to-bigint (fn [s]
(apply +
(map
(fn [c n] (* (bigint (int c)) (clojure.math.numeric-tower/expt 256 n)))
s
(range (count s)))))
expt-mod (fn [b e n] (bigint (.modPow (biginteger b) (biginteger e) (biginteger n))))
base64-table
{0 "A" 16 "Q" 32 "g" 48 "w"
1 "B" 17 "R" 33 "h" 49 "x"
2 "C" 18 "S" 34 "i" 50 "y"
3 "D" 19 "T" 35 "j" 51 "z"
4 "E" 20 "U" 36 "k" 52 "0"
5 "F" 21 "V" 37 "l" 53 "1"
6 "G" 22 "W" 38 "m" 54 "2"
7 "H" 23 "X" 39 "n" 55 "3"
8 "I" 24 "Y" 40 "o" 56 "4"
9 "J" 25 "Z" 41 "p" 57 "5"
10 "K" 26 "a" 42 "q" 58 "6"
11 "L" 27 "b" 43 "r" 59 "7"
12 "M" 28 "c" 44 "s" 60 "8"
13 "N" 29 "d" 45 "t" 61 "9"
14 "O" 30 "e" 46 "u" 62 "+"
15 "P" 31 "f" 47 "v" 63 "/"}
bigint-to-base64 (fn bigint-to-base64
[n]
(if (>= n 64)
(concat (list (get base64-table (rem n 64))) (bigint-to-base64 (quot n 64)))
(list (get base64-table n))))
add-padding (fn [s] (str s (apply str (repeat (- 86 (count s)) "A"))))
public-key 1122806372610712283641764701710834148204234645585040684037170652091590554067499953763526724213941221496764286040865822589763248156452468642704658988427843N
secret-key 861280222834211635003719961005341323199464182108597666477205899292436716184420718855991902898025496028982723694319590089136399532658790932223389304471553N]
[
(count target)
target
(md5-to-bigint target)
(expt-mod (md5-to-bigint target) secret-key public-key)
(add-padding (apply str (bigint-to-base64 (expt-mod (md5-to-bigint target) secret-key public-key))))
])
```
Powered by shinGETsu.