AES の CTR モード

[crypto][erlang]AES の CTR モードのストリームタイプ

暗号データにランダムアクセスが可能になる (IVec が固定) ため、並列処理が可能となる AES の Counter Mode を試してみました。

ストリーム暗号なので、パディングがいらないのがいいですね。

まずは基本的なところで

Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:4:4] [async-threads:0] [kernel-poll:false] [dtrace]

Eshell V5.9.2  (abort with ^G)
1> Key = crypto:strong_rand_bytes(32).
<<195,208,93,158,92,153,199,116,175,237,136,222,99,112,
  132,235,113,181,239,230,36,227,75,166,220,44,94,0,152,
  ...>>
2> IV = crypto:strong_rand_bytes(16).
<<103,24,128,108,59,235,30,41,208,236,122,47,44,216,200,2>>
3> Cipher = crypto:aes_ctr_encrypt(Key, IV, <<"spam">>). 
<<145,208,153,142>>
4> crypto:aes_ctr_decrypt(Key, IV, Cipher).
<<"spam">>

Erlang の crypto には aes_ctr_stream_init/2 があるのでそれを使ってみます

Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:4:4] [async-threads:0] [kernel-poll:false] [dtrace]

Eshell V5.9.2  (abort with ^G)
1> Key = crypto:strong_rand_bytes(32).
<<91,111,86,156,1,12,23,244,91,25,153,159,25,139,115,205,
  228,100,158,61,9,64,165,14,185,43,243,39,33,...>>
2> IV = crypto:strong_rand_bytes(16).
<<154,49,236,153,246,155,109,146,212,65,155,56,184,226,
  142,215>>
3> State = crypto:aes_ctr_stream_init(Key, IV).
{<<91,111,86,156,1,12,23,244,91,25,153,159,25,139,115,205,
   228,100,158,61,9,64,165,14,185,43,243,39,...>>,
 <<154,49,236,153,246,155,109,146,212,65,155,56,184,226,
   142,215>>,
 <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>,
 0}
4> {NewState, Cipher} = crypto:aes_ctr_stream_encrypt(State, <<"spam">>).
{{<<91,111,86,156,1,12,23,244,91,25,153,159,25,139,115,
    205,228,100,158,61,9,64,165,14,185,43,243,...>>,
  <<154,49,236,153,246,155,109,146,212,65,155,56,184,226,
    142,216>>,
  <<255,161,127,123,51,205,69,22,77,219,85,251,253,52,200,
    200>>,
  4},
 <<140,209,30,22>>}
5> crypto:aes_ctr_stream_decrypt(State, Cipher).   
{{<<91,111,86,156,1,12,23,244,91,25,153,159,25,139,115,
    205,228,100,158,61,9,64,165,14,185,43,243,...>>,
  <<154,49,236,153,246,155,109,146,212,65,155,56,184,226,
    142,216>>,
  <<255,161,127,123,51,205,69,22,77,219,85,251,253,52,200,
    200>>,
  4},
 <<"spam">>}

参考

PySide を Mac 10.7.5 で使う

PyQt をちまちまと試していたのですが @nobonobo から PySide も Python3.3 に対応したのが MacPorts にあるよという事を教えて頂いたので試してみました。

そもそも PyQt や PySide はインストールが色々めんどくさいというイメージがあり、手を付けるのがめんどくさいなぁと思っていました。

とりあえず試すだけ試してみました。

sudo port install py33-pyside

特にはまることも無くインストールが完了し、あとはサンプルコードを書いて実行したところ問題なく動作しました。

# encoding=utf8

import sys

from PySide import QtGui

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        hello_button = QtGui.QPushButton("はろーぱいさいど")
        self.setCentralWidget(hello_button)

def main():
    app = QtGui.QApplication(sys.argv)

    form = MainForm()
    form.show()

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

インストールコストがとても低くなっていることにびっくりしました。

難しい事は全然知らないのでまだ PyQt と PySide の違いにぶつかっておりません。 とりあえずは PyQt ではなく PySide で勉強を続ける予定です。

とにかくちまちま手を動かすことから始めるしかないですね。

参考

TODO 2012-11

もうあと 2 ヶ月ありませんが、今年中にやることメモ

  • Erlang

    • ldap (eldap)

      • 環境構築から始まってもう少し使ってみる
    • syslog (erlang-syslog)

      • 環境構築から始まってもう少し使ってみる
  • Python

    • PyQt / PySide

      • まずは GUI の使い方を覚える
    • Boto

      • Glacier と S3 あたりの連携、さらには PyQt での GUI
  • LXC

    • 検証環境には XenServer より良さそうなので、触っていく

オライリー OAuth 2.0

オライリー様から OAuth 2.0 本を献本頂きました。

O'Reilly Japan - OAuth 2.0をはじめよう http://www.oreilly.co.jp/books/9784873115580/

OAuth はあまり詳しくなく 1.0 と 2.0 の違いも 2.0 ではかなり簡単になったという話を聞いた程度だったのですが、 OAuth 2.0 の RFC が出ていて (OAuth 1.0 の RFC も出てましたが ... ) すこしはこっちも読んでおかないとなと思っていた矢先でした。

RFC 6749 - The OAuth 2.0 Authorization Framework http://tools.ietf.org/html/rfc6749 RFC 6750 - The OAuth 2.0 Authorization Framework http://tools.ietf.org/html/rfc6750

ページとしては 40 ページ前後。OAuth の必要性から始まって実際のサービスを使って使い方や概念を説明していきます。

大きく分けてクライアント側とサーバ側の説明です。ただし注意点として OAuth の認可サーバ(トークンを手に供する側)の話はほとんどありません。

よほどメジャーなサービスを提供していない限り OAuth サーバを提供することは無いでしょうし、もし提供する場合は RFC をがっつり読み込む方が無難です。

サーバサイド Web アプリ

PythonRuby などでサーバサイドを構築したときに、リソース取得アクセスできるようにする話が主です。基本的にはこれが多いのでは無いでしょうか。

クライアントサイド Web アプリ

JS から使う事が主に説明されています。JS からリソース取得を出来るようにする話が主です。 サーバサイドとは違いかなり何かしら制限されている状況で使うべきという話が書いてあります。

モバイルアプリ

バックエンドにサーバがいるかどうかでリソースへのアクセスが変わると思います。直接 GitHub にアクセスしたい場合と、一端サーバにアクセスしてそこで保持しているトークンを使う場合など、パターンがある事が書いてあります。

感想

認証や認可というかなり一般的では無い話をかなり短い中でも理解しやすいよう説明しています。さらに OAuth 2.0 の説明だけでは無く、サンプルソースコードも載っておりイメージもしやすいです。

ほとんどの開発者は OAuth を「使う」側だと思いますので、この本がぴったりです。 これから FacebookTwitter (まだ 1.0 系らしいです) などの提供しているリソースを使ったサービスは増え続けていくでしょう。そんなとき基本的な OAuth の仕組みを短い時間で理解できる良著です。

ちなみにこの本 ... epub だけでなく、Kindle で読める mobi にも対応していたりします。

Python & AWS クックブック

オライリー様から Python & AWS クックブックを献本頂きました。

Python & AWS クックブック http://www.oreilly.co.jp/books/9784873115436/

個人的には boto では S3 と Glaicer しか触ってないので、とても楽しみでした。

概要とセットアップ

この本は EC2 と S3 を boto から扱う際のクックブックです。

boto のセットアップが github、ソース、pip、easy_install、virtualenv まで書いてあって至れり尽くせりです。

さらにはアクセスキーを /etc/boto.cfg または ~/.boto に書く話が書いてあって好印象です。

EC2 クックブック

正直言いますと EC2 は AWS Console からしか触ったこと無い情弱だったりします。ただ、この本を読んであぁこうしたいときはこうするんだーというのが多々ありました。最低限必要な部分が絞り込まれて書かれている印象です。

起動、停止から始まりモニタリング、バックアップ。さらにはインスタンスのクローンまで。これ一冊で boto から EC2 を使う基礎を学べると思います。

S3 クックブック

仕事で Sphinx + S3 でウェブサイトを構築する際にアップローダーとして boto から S3 を触りました。

この本では S3 の「機能」を boto から使う方法を紹介しています。期限付き URL やメタデータ、さらにはバージョニングを有効にするなど。自分が使った静的 Web サイト構築の話も書いています。

一通り読んでしまえば、あとは組み合わせの問題になると思います。

感想

サンプルコードが沢山あって、説明を日本語で書いてあるのは嬉しいです。クックブックの醍醐味ですね。ただクックブックって必要な時に引くイメージなのですが、これは薄いので S3 や EC2 を使って何が出来るのかというのもざっくり知るのにも向いているのかも知れません。

かなり短いコードでやりたいことが実現出来る事もあって、初心者にも優しいです。

  • EC2 や S3 を AWS Console からしか使っていない Pythonista
  • EC2 や S3 を使ったこと無い Pythonista
  • Python を初めて見たいけど、何してイイかわからない人

この辺がおすすめの対象でしょうか。特に Python 初めて見たいけど何をしていいかわからない人は何かのデータをアップロードする先に S3 を使ってみるための勉強用本としてもいいかもしれません。

薄くて読みやすいとても良著です。

Python を勉強するなら ..

初心者の方で本で勉強したい人は以下の二冊をオススメします

ウェブで十分であればドキュメントが翻訳されています

boto

boto ("ぼとぅ" って読むらしいですが本当なのでしょうか) はとても活発に開発されています。

会社比較表を公開してみて思ったこと

追記

あまり好ましくない作業が行われていたと判断したので、消しました。自分も見れません。

共同編集者の皆様、とても楽しい情報をありがとうございました。

原文

元ネタは @sifue さんの転職ブログ。

株式会社インクスを退職して株式会社ドワンゴに入社しました - しふーのブログ http://d.hatena.ne.jp/sifue/20121003/1349279980

ここで、比較表が出ていて、内容が完全に技術者よりでぐっときたので Google Docs で公開してみた。

項目は @sifue さんの完全にパクリ。

https://docs.google.com/spreadsheet/ccc?key=0AgsKtP8AY5SzdGVCbWJ5d2FJbmdWaV9yR1liSGFrU0E&pli=1#gid=0

公開したのが夜中の 2:00 だったにも関わらず張り付いている人の多いこと多いこと。常時 20 人くらいが張り付いてました。さらにどんどんと会社が追加されていきました。

そして今はなんと 30 社以上の情報が公開されています。

見てみると、とても面白いですね色々あって。社名が匿名なのが特にいい感じです。

純粋にこんな会社あるんだーって思えるので。

この情報って技術者が会社を選ぶときに凄く重要な気がします。これがサービスとして展開されると面白そうですね。ただ内容に保証がないので難しいところですが。

これに求人がくっついてるのが2件ほどあって、にやりとしました。興味ある人は会社を当てて連絡するといいともいますよ。これ系のサイトで求人サイトあれば面白いのになぁって思いました。

蛇足

公開されているのは任意での書き込みなのでやばそうなのがあったらさくっと公開やめて削除します。

LZ4 の Erlang バインディングを(作ってもらって)使ってみた

LZ4 Extremely Fast Compression algorithm

http://code.google.com/p/lz4/

ドラクエ 10 にも使われている圧縮アルゴリズム LZ4 を Erlang から使うバインディングを試してみました。

https://github.com/joewilliams/erlang-lz4

動かしてみたところ ... セグフォ ... というカナシイ結果でした ... 。

@szktty 版

ということで仕事で Erlang の NIF ばかり書いているという噂の @szktty を言いくるめて、作ってもらいました。

https://github.com/szktty/erlang-lz4

APL2.0 で公開されています。

compress/uncompress

APIErlang ライクになっています。そもそも圧縮ライブラリなので compress/uncompress は圧縮、展開するだけです。 ただし世に出回っているバインディングは圧縮前のサイズをくっつけて圧縮後としているので気持ち悪い仕様でした。

このバインディングは展開する際は圧縮前のサイズを引数に取ります。

-type option() :: high | {block, integer()}.
-spec compress(binary()) -> {ok, binary()} | {error, term()}.
-spec compress(binary(), [option()]) -> {ok, binary()} | {error, term()}.
-spec uncompress(binary(), integer()) -> {ok, binary()} | {error, term()}.

pack/unpack

ただ、上のだけだと使いづらいと思うので、Python や node.js バインディングが使っている圧縮前の長さをくっつけた版に対応した API も用意してもらいました。

-type pack() :: binary().
-spec pack(binary()) -> {ok, pack()} | {error, term()}.
-spec pack(binary(), [option()]) -> {ok, pack()} | {error, term()}.
-spec unpack(pack()) -> {ok, binary()} | {error, term()}.

サンプル

文字列データに効果があるらしいので文字列で試してみました。

%% 文字データをまず作ります
1> Raw = <<"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.">>.

%% 1000 倍にしてみます
2> Raw1 = binary:copy(Raw, 1000).

%% 圧縮します
3> {ok, C} = lz4:pack(Raw1).
{ok,<<96,228,1,0,242,88,76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,...>>}

%% 圧縮前のサイズ
4> byte_size(Raw1).
124000

%% 圧縮後のサイズ
5> byte_size(C).   
622

%% 戻します
6> {ok, U} = lz4:unpack(C).
{ok,<<"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolo"...>>}

%% 圧縮前と戻したデータが一致しました
7> Raw1 =:= U.
true

感想

かなりの効果はでるようですが、文字データじゃないバイナリデータの場合はあまり効果なさそうでした。完全なランダムバイナリでは一切効果は出ませんでした(まぁ当たり前ですが)。

それにしてもサクサク NIF を作れる @szktty さすがですね。