シーザー暗号をブルートフォースアタックしてみる

暗号技術入門を買ったのでちょっとずつ読んでます。

暗号技術入門 第3版

暗号技術入門 第3版

第二章で シーザー暗号をブルートフォースアタックするクイズがあったので
common lisp で やってみた記録です

(defun shift-string (str shift)
    (map
        'string 
        #'(lambda (c)
            (code-char
                (+
                    (mod (- (char-int c) (char-int #\A) shift) 26)
                    (char-int #\A))))
        str))

(defun caesar-attack (str)
    (dotimes (i 26)
        (format
            t
            "~A, ~A~%"
            i (shift-string str i))))

こんな感じで使います

? (caesar-attack "ABCDEFG")
0, ABCDEFG
1, ZABCDEF
2, YZABCDE
3, XYZABCD
4, WXYZABC
5, VWXYZAB
6, UVWXYZA
7, TUVWXYZ
8, STUVWXY
9, RSTUVWX
10, QRSTUVW
11, PQRSTUV
12, OPQRSTU
13, NOPQRST
14, MNOPQRS
15, LMNOPQR
16, KLMNOPQ
17, JKLMNOP
18, IJKLMNO
19, HIJKLMN
20, GHIJKLM
21, FGHIJKL
22, EFGHIJK
23, DEFGHIJ
24, CDEFGHI
25, BCDEFGH
NIL

もうちょっとキレイに書けるようになりたいなぁ。。。

追記

ちょっときれいにしてみたつもり

(defun shift-string (str shift)
  (let ((s (string-upcase str)))
   (map
        'string
        #'(lambda (c)
            (let ((c-idx (- (char-int c) (char-int #\A))))
              (code-char
                (+
                    (mod (- c-idx shift) 26)
                    (char-int #\A)))))
        s)))

(defun caesar-attack (str)
    (dotimes (i 26)
        (format
            t
            "~A, ~A~%"
            i (shift-string str i))))

roswell を使用した実行方法もメモ

$ ros run --load caesar-attack.lisp -e '(caesar-attack "abcde")' -q

keycloak-gatekeeper をビルドしてみる

keycloal の APIゲートウェイ の Keyclaok-Gatekeeper をビルドしてみます。 github.com

$ go get github.com/keycloak/keycloak-gatekeeper
$ cd ~/go/src/github.com/keycloak/keycloak-gatekeeper
$ dep ensure
$ go build

$ ./keycloak-gatekeeper --version
keycloak-gatekeeper version v2.3.0 (git+sha: no gitsha provided, built: 01-01-1970)

Docker Swarm で sticky session の LBを立てる

検証のため sticky sessionのLBが欲しかったのです。

nginx とか Apache でLB作ってもいいんですが、コンパイルが必要だったりモジュール入れたりめんどくさそう・・・
いろいろ調べてたら なんか Docker Swarm で traefik を使えばできそうだったのでやってみました。

環境

OS version

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"

docker version

# docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:49:01 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:16:44 2018
  OS/Arch:          linux/amd64
  Experimental:     false

手順

swarm mode

swame mode にします。

# docker swarm init
Swarm initialized: current node (y66s0tr38tdfobqklee89d5i7) is now a manager.

# docker node ls
ID                            HOSTNAME              STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
y66s0tr38tdfobqklee89d5i7 *   ****   Ready               Active              Leader              18.09.0

docker compose ファイルを作成します

version: "3"

services:

  whoami:
    image: tutum/hello-world
    networks:
      - net
    ports:
      - "80"
    deploy:
      restart_policy:
        condition: any
      mode: replicated
      replicas: 5
      update_config:
        delay: 2s
      labels:
        - "traefik.docker.network=test_net"
        - "traefik.port=80"
        - "traefik.frontend.rule=PathPrefix:/hello;"
        - "traefik.backend.loadbalancer.sticky=true"

  loadbalancer:
    image: traefik
    command: --docker \
      --docker.swarmmode \
      --docker.watch \
      --web \
      --loglevel=DEBUG
    ports:
      - 80:80
      - 9090:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      restart_policy:
        condition: any
      mode: replicated
      replicas: 1
      update_config:
        delay: 2s
      placement:
         constraints: [node.role == manager]
    networks:
      - net

networks:
  net:

docker stack deploy

docker swarm に 先程作ったcomposeファイルを使用してコンテナのデプロイを行います

# docker stack deploy -c docker-compose.swarm.yml test
Creating network test_net
Creating service test_whoami
Creating service test_loadbalancer

# docker stack ls
NAME                SERVICES            ORCHESTRATOR
test                2                   Swarm

# docker ps 
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS               NAMES
93f4aedc3e2c        traefik:latest             "/traefik --docker '…"   23 seconds ago      Up 9 seconds        80/tcp              test_loadbalancer.1.g29b0pvnvna3dznnx2itt7gbr
fa9b6f64e7d3        tutum/hello-world:latest   "/bin/sh -c 'php-fpm…"   29 seconds ago      Up 6 seconds        80/tcp              test_whoami.4.qn4wph6t3vqtjq5o7uc2r12zs
b25c164b5658        tutum/hello-world:latest   "/bin/sh -c 'php-fpm…"   29 seconds ago      Up 9 seconds        80/tcp              test_whoami.1.lbh83j9ruenjv8vsrzj0mk17g
93842a9fffd5        tutum/hello-world:latest   "/bin/sh -c 'php-fpm…"   29 seconds ago      Up 9 seconds        80/tcp              test_whoami.5.aezv9xt4fda4y72tb5a3v72d7
74b06ecaa0b9        tutum/hello-world:latest   "/bin/sh -c 'php-fpm…"   29 seconds ago      Up 10 seconds       80/tcp              test_whoami.3.50uxml9u0xco2ulqjj3ujtbsg
10cb355434a8        tutum/hello-world:latest   "/bin/sh -c 'php-fpm…"   29 seconds ago      Up 11 seconds       80/tcp              test_whoami.2.dxik1yuou7pf3y6zkmptbcgkq

起動確認

http://127.0.0.1:9090 にアクセスしてみます

f:id:moremagic:20190108223323p:plain こんな感じに コンテナが5個見えれば無事起動できてます

sticky session の確認

# curl -vs -c cookie.txt -b cookie.txt http://127.0.0.1/hello -o /dev/null
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET /hello HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/7.58.0
> Accept: */*
> Cookie: _TRAEFIK_BACKEND=http://10.0.0.6:80
> 
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=UTF-8
< Date: Tue, 08 Jan 2019 13:34:56 GMT
< Server: nginx/1.8.0
< X-Powered-By: PHP/5.6.14
< Content-Length: 478
< 
{ [478 bytes data]
* Connection #0 to host 127.0.0.1 left intact

何回試しても Cookie: _TRAEFIK_BACKEND のIPが同じになります
また cookie.txt を一回消すと変わることが確認できます

止め方

# docker stack rm test
Removing service test_loadbalancer
Removing service test_whoami
Removing network test_net

資料

以下の資料を参考にしてます

www.littlebigextra.com

CommonLispのパッケージ管理についての基礎

パッケージ管理周りの情報をまとめておこう。

Quicklisp

ASDF2

  • 指定のライブラリをコンパイル、ロードできるようにする
    • asdファイルっていうのを使う
    • ローカルのライブラリを使うようにもできる

Roswell

  • 処理系のインストール、切り替え、処理系ごとのオプションの違いの吸収

参考

http://diary.wshito.com/comp/lisp/lisp-pm/ http://dev.ariel-networks.com/wp/archives/365 https://fu7mu4.hatenablog.com/entry/20150101/1420096959 http://takoeight0821.hatenablog.jp/entry/2016/10/15/183557 http://blog.8arrow.org/entry/2015/06/11/101511

メモ Javascript Engine の種類

Javascriptエンジンっていっぱいあるからよくわからないのでメモメモ。

name author wikipedia
Google V8 JavaScript Engine google https://ja.wikipedia.org/wiki/Google_V8_JavaScript_Engine
ChakraCore MicroSoft https://ja.wikipedia.org/wiki/Chakra#ChakraCore
SpiderMonkey mozila https://ja.wikipedia.org/wiki/SpiderMonkey

defstruct(構造体定義) について

common lisp の構造体の使い方がやっとわかったのでメモ

  • こんな感じで構造体を作ることができる
? (defstruct human
  (height 0)
  (weight 0))
HUMAN

? (make-human) ;; デフォルトのコンストラクタ名は make-<構造体名>
#S(HUMAN :HEIGHT 0 :WEIGHT 0)

? (make-human :height 999)
#S(HUMAN :HEIGHT 999 :WEIGHT 0)

? (make-human :weight 999)
#S(HUMAN :HEIGHT 0 :WEIGHT 999)

? (make-human :height 1 :weight 2)
#S(HUMAN :HEIGHT 1 :WEIGHT 2)
  • 引数 :constructor で 構造体を生成する関数名を指定することができる
?  (defstruct (keymap (:constructor aaa)) (a 1))
KEYMAP

? (aaa)
#S(KEYMAP :A 1)

? (aaa :a 100)
#S(KEYMAP :A 100)

? (make-keymap) ;; デフォルトの構造体コンストラクタは使えない
> Error: Undefined function MAKE-KEYMAP called with arguments () .
> While executing: CCL::TOPLEVEL-EVAL, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Retry applying MAKE-KEYMAP to NIL.
> Type :? for other options.
1 >
  • 引数 :print-function で渡した関数で表示方法を規定することができる
(defun print-hoge (hoge stream depth)
  (format stream "#hoge<~Ahoge>" (hoge-hoge hoge)))
;Compiler warnings :
;   In PRINT-HOGE: Undefined function HOGE-HOGE
;   In PRINT-HOGE: Unused lexical variable DEPTH
PRINT-HOGE

?  (defstruct (hoge (:print-function print-hoge)) (hoge 0))
HOGE

? (make-hoge)
#hoge<0hoge>

? (make-hoge :hoge 1000)
#hoge<1000hoge>

参考

qiita.com