<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>へびにっき &#187; Ruby</title>
	<atom:link href="http://wp.serpere.info/archives/tag/ruby/feed" rel="self" type="application/rss+xml" />
	<link>http://wp.serpere.info</link>
	<description>樹上で暮らすヘビのように生きたい</description>
	<lastBuildDate>Mon, 06 Sep 2010 07:43:34 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Ruby 1.9/1.8.7 では PKCS5 PBKDF2 が使える</title>
		<link>http://wp.serpere.info/archives/530</link>
		<comments>http://wp.serpere.info/archives/530#comments</comments>
		<pubDate>Fri, 12 Jun 2009 16:18:19 +0000</pubDate>
		<dc:creator>tkyk</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[暗号]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=530</guid>
		<description><![CDATA[ドキュメントには記されていないが、OpenSSL::PKCS5 というクラスが存在し、OpenSSL の PBKDF2 実装にアクセスすることができる。ただし OpenSSL 自体の制約により、バージョン0.9.8kの時点ではハッシュ関数として HMAC-SHA1 しか使用できない。 keys = OpenSSL::PKCS5.pbkdf2_hmac_sha1&#40;&#34;password&#34;, &#34;saltsalt&#34;, 1000, 16&#41; p keys.unpack&#40;&#34;H*&#34;&#41;.join #=&#62; &#34;e9febff54bfce668fde301acc85563cc&#34; OpenSSL の将来のバージョン（1.0.0?）ではより汎用的な関数が追加される予定であり、Ruby からも利用できるようになるようだ。 keys = OpenSSL::PKCS5.pbkdf2_hmac&#40;&#34;password&#34;, &#34;saltsalt&#34;, 1000, 32, &#34;sha256&#34;&#41; # =&#62; OpenSSL 0.9.8k では NotImplementedError このあたりがまだ中途半端なので、ドキュメントには記されていないのだろうか。 Ruby のリポジトリをチェックしてみると、2007年4月5日にまず trunk に対して追加され、その後1.8系にバックポートされたらしい。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F530%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ruby%201.9%2F1.8.7%20%E3%81%A7%E3%81%AF%20PKCS5%20PBKDF2%20%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8B%22%20%7D);"></div>
<p>ドキュメントには記されていないが、OpenSSL::PKCS5 というクラスが存在し、OpenSSL の PBKDF2 実装にアクセスすることができる。ただし OpenSSL 自体の制約により、バージョン0.9.8kの時点ではハッシュ関数として HMAC-SHA1 しか使用できない。</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">keys = <span style="color:#6666ff; font-weight:bold;">OpenSSL::PKCS5</span>.<span style="color:#9900CC;">pbkdf2_hmac_sha1</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;password&quot;</span>, <span style="color:#996600;">&quot;saltsalt&quot;</span>, <span style="color:#006666;">1000</span>, <span style="color:#006666;">16</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">p</span> keys.<span style="color:#9900CC;">unpack</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;H*&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">join</span> <span style="color:#008000; font-style:italic;">#=&gt; &quot;e9febff54bfce668fde301acc85563cc&quot;</span></pre></div></div>



<p>OpenSSL の将来のバージョン（1.0.0?）ではより汎用的な関数が追加される予定であり、Ruby からも利用できるようになるようだ。</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">keys = <span style="color:#6666ff; font-weight:bold;">OpenSSL::PKCS5</span>.<span style="color:#9900CC;">pbkdf2_hmac</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;password&quot;</span>, <span style="color:#996600;">&quot;saltsalt&quot;</span>, <span style="color:#006666;">1000</span>, <span style="color:#006666;">32</span>, <span style="color:#996600;">&quot;sha256&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># =&gt; OpenSSL 0.9.8k では NotImplementedError</span></pre></div></div>



<p>このあたりがまだ中途半端なので、ドキュメントには記されていないのだろうか。</p>
<p>Ruby のリポジトリをチェックしてみると、2007年4月5日にまず trunk に対して追加され、その後1.8系にバックポートされたらしい。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/530/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>暗号乱数インフラの初期化処理</title>
		<link>http://wp.serpere.info/archives/512</link>
		<comments>http://wp.serpere.info/archives/512#comments</comments>
		<pubDate>Sat, 06 Jun 2009 13:21:56 +0000</pubDate>
		<dc:creator>tkyk</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[暗号]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=512</guid>
		<description><![CDATA[暗号ライブラリ内部でどんな処理が行われているのか、Ruby と PHP について調べてみた。調査に使用したバージョンは ruby-1.9.1-p129, php-5.2.9, openssl-0.9.8k ruby-openssl ライブラリの場合 乱数用のインターフェイスは OpenSSL::Random モジュール。例えば salt = OpenSSL::Random.random_bytes&#40;8&#41; とすると8バイトのランダムなバイト列が取得できるのだが、こんな風に初期化処理なしで、いきなり乱数の取得メソッドを使っても大丈夫なのだろうか？ Ruby のソースを見ると random_bytes の定義は ossl_rand.c にあり、実体は OpenSSL の RAND_bytes() に対するアダプタ OpenSSL のソースを見ると RAND_bytes の定義は rand_lib.c にあり、実体は（非FIPSモードでは）md_rand.c の中の ssleay_rand_bytes() ssleay_rand_bytes() の中で初期化済みか否か（initialized）を調べて、初期化済みでなかったら RAND_poll() を呼び出す RAND_poll の定義はOS/環境ごとに分かれているが、可能な限りのソースからエントロピーを収集するようになっている UNIX: rand_unix.c 通常はまず乱数デバイスからエントロピーの読み出しを試みる。試行対象となるデバイスのパスは e_os.h で DEVRANDOM として定義されており、デフォルトでは /dev/urandom が最優先となる（この際、Linux では poll, その他では select を使って非同期で読み出される）。それでも十分なエントロピーが集まらなかった場合、エントロピー収集デーモン（EGD）のソケットファイルから読み出しを試みる（こちらも e_os.h [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F512%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E6%9A%97%E5%8F%B7%E4%B9%B1%E6%95%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%E5%87%A6%E7%90%86%22%20%7D);"></div>
<p>暗号ライブラリ内部でどんな処理が行われているのか、Ruby と PHP について調べてみた。調査に使用したバージョンは ruby-1.9.1-p129, php-5.2.9, openssl-0.9.8k</p>
<h3>ruby-openssl ライブラリの場合</h3>
<p>乱数用のインターフェイスは <a href="http://doc.okkez.net/191/view/class/OpenSSL=Random">OpenSSL::Random</a> モジュール。例えば</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">salt = <span style="color:#6666ff; font-weight:bold;">OpenSSL::Random</span>.<span style="color:#9900CC;">random_bytes</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">8</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>



<p>とすると8バイトのランダムなバイト列が取得できるのだが、こんな風に初期化処理なしで、いきなり乱数の取得メソッドを使っても大丈夫なのだろうか？</p>
<ol>
<li>Ruby のソースを見ると random_bytes の定義は ossl_rand.c にあり、実体は OpenSSL の RAND_bytes() に対するアダプタ</li>
<li>OpenSSL のソースを見ると RAND_bytes の定義は rand_lib.c にあり、実体は（非FIPSモードでは）md_rand.c の中の ssleay_rand_bytes()</li>
<li>ssleay_rand_bytes() の中で初期化済みか否か（initialized）を調べて、初期化済みでなかったら RAND_poll() を呼び出す</li>
<li>RAND_poll の定義はOS/環境ごとに分かれているが、可能な限りのソースからエントロピーを収集するようになっている
<ul>
<li>UNIX: rand_unix.c 通常はまず乱数デバイスからエントロピーの読み出しを試みる。試行対象となるデバイスのパスは e_os.h で DEVRANDOM として定義されており、デフォルトでは /dev/urandom が最優先となる（この際、Linux では poll, その他では select を使って非同期で読み出される）。それでも十分なエントロピーが集まらなかった場合、エントロピー収集デーモン（EGD）のソケットファイルから読み出しを試みる（こちらも e_os.h に試行対象となるパスが定義されている）。さらに pid と uid と現在時刻もエントロピーとして追加する。</li>
<li>Windows: rand_win.c の場合は CryptAPI の CryptGenRandom() 関数から取得した疑似乱数をエントロピーとして追加する。さらにメモリ使用量やプロセスIDといったデータもエントロピーとして追加する。</li>
</ol>
<p>ということで、ほとんどのケースではいきなり random_bytes メソッドなどを使っても大丈夫そうである。</p>
<p>ちなみに OpenSSL::Random モジュールには十分なエントロピーで初期化されたかどうかを調べる status? メソッドもある（現在はUndocumentedだが）。こちらもソースをたどって行けば初期化コードに繋がっているので、システムに十分なエントロピーが存在する環境ならば、常に true を返すはずである。</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">OpenSSL::Random</span>.<span style="color:#9900CC;">status</span>?  <span style="color:#008000; font-style:italic;">#=&gt; true</span></pre></div></div>



<h3>php-mcrypt ライブラリの場合</h3>
<p>直接的な乱数インターフェイスは存在しないが、初期化ベクトルの生成用として <a href="http://jp.php.net/manual/ja/function.mcrypt-create-iv.php">mcrypt_create_iv()</a> 関数が用意されている。 この関数の定義は ext/mcrypt/mcrypt.c にあり、中身は指定されたソース（/dev/random または /dev/urandom）からそのままデータを読み出しているだけだった。</p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">fd <span style="color: #339933;">=</span> open<span style="color: #009900;">&#40;</span>source <span style="color: #339933;">==</span> RANDOM <span style="color: #339933;">?</span> <span style="color: #ff0000;">&quot;/dev/random&quot;</span> <span style="color: #339933;">:</span> <span style="color: #ff0000;">&quot;/dev/urandom&quot;</span><span style="color: #339933;">,</span> O_RDONLY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>fd <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	efree<span style="color: #009900;">&#40;</span>iv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	php_error_docref<span style="color: #009900;">&#40;</span>NULL TSRMLS_CC<span style="color: #339933;">,</span> E_WARNING<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Cannot open source device&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	RETURN_FALSE<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>read_bytes <span style="color: #339933;">&lt;</span> size<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	n <span style="color: #339933;">=</span> read<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> iv <span style="color: #339933;">+</span> read_bytes<span style="color: #339933;">,</span> size <span style="color: #339933;">-</span> read_bytes<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	read_bytes <span style="color: #339933;">+=</span> n<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
n <span style="color: #339933;">=</span> read_bytes<span style="color: #339933;">;</span>
close<span style="color: #009900;">&#40;</span>fd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



<p>結構ナイーブな実装だな、というのが率直な感想。てっきり mcrypt に対応するインターフェイスがあって、処理を委譲しているのかと思っていたが…（気になって libmcrypt-2.5.8 のソースもざっとチェックしてみたが、やはり乱数の処理は入っていないようだ）。</p>
<p>Non-blocking I/O を使うなどの工夫は無いため、/dev/random では読み出しでブロックする可能性がある。また MCRYPT_RAND は単に rand 関数を必要な回数呼び出すだけなので、暗号用途では使うべきではない（つまりWindows環境では実質使用できない、ということになる）。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/512/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSSL::Cipher::Cipher のパディング処理</title>
		<link>http://wp.serpere.info/archives/432</link>
		<comments>http://wp.serpere.info/archives/432#comments</comments>
		<pubDate>Sat, 25 Apr 2009 07:49:08 +0000</pubDate>
		<dc:creator>tkyk</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[暗号]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=432</guid>
		<description><![CDATA[OpenSSL::Cipher::Cipher#padding= でパディング処理の有無を制御できる。では実際にどのようなパディング処理が行われているのだろう？ 暗号化時にはパディングを有効にして、復号時に無効にすれば確認できる。 # Ruby 1.8.7 or 1.9 require 'openssl' &#160; def enc_dec_base&#40;operation&#41; password = 'fixed password' &#160; lambda do &#124; cipher, data, padding &#124; c = OpenSSL::Cipher::Cipher.new&#40;cipher&#41; c.send&#40;operation&#41; c.padding = padding c.pkcs5_keyivgen&#40;password&#41; c.update&#40;data&#41; + c.final end end encrypt = enc_dec_base&#40;:encrypt&#41; decrypt = enc_dec_base&#40;:decrypt&#41; &#160; cipher = 'aes-256-cbc' msg = 'ABCDEFGHIJKLMNOP' # 16bytes = AES [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F432%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSSL%3A%3ACipher%3A%3ACipher%20%E3%81%AE%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%87%A6%E7%90%86%22%20%7D);"></div>
<p>OpenSSL::Cipher::Cipher#padding= でパディング処理の有無を制御できる。では実際にどのようなパディング処理が行われているのだろう？</p>
<p>暗号化時にはパディングを有効にして、復号時に無効にすれば確認できる。</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Ruby 1.8.7 or 1.9</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'openssl'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> enc_dec_base<span style="color:#006600; font-weight:bold;">&#40;</span>operation<span style="color:#006600; font-weight:bold;">&#41;</span>
  password = <span style="color:#996600;">'fixed password'</span>
&nbsp;
  <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span> cipher, data, padding <span style="color:#006600; font-weight:bold;">|</span>
    c = <span style="color:#6666ff; font-weight:bold;">OpenSSL::Cipher::Cipher</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>cipher<span style="color:#006600; font-weight:bold;">&#41;</span>
    c.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>operation<span style="color:#006600; font-weight:bold;">&#41;</span>
    c.<span style="color:#9900CC;">padding</span> = padding
    c.<span style="color:#9900CC;">pkcs5_keyivgen</span><span style="color:#006600; font-weight:bold;">&#40;</span>password<span style="color:#006600; font-weight:bold;">&#41;</span>
    c.<span style="color:#9900CC;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span>data<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> c.<span style="color:#9900CC;">final</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>





<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">encrypt = enc_dec_base<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:encrypt</span><span style="color:#006600; font-weight:bold;">&#41;</span>
decrypt = enc_dec_base<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:decrypt</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
cipher = <span style="color:#996600;">'aes-256-cbc'</span>
msg = <span style="color:#996600;">'ABCDEFGHIJKLMNOP'</span> <span style="color:#008000; font-style:italic;"># 16bytes = AES block size</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&#40;</span>1..<span style="color:#9900CC;">msg</span>.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>len<span style="color:#006600; font-weight:bold;">|</span>
  plain = msg<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>, len<span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
  encrypted = encrypt<span style="color:#006600; font-weight:bold;">&#91;</span>cipher, plain, <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  decrypted = decrypt<span style="color:#006600; font-weight:bold;">&#91;</span>cipher, encrypted, <span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#008000; font-style:italic;"># disable padding</span>
&nbsp;
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;original message: #{plain}&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">p</span> plain.<span style="color:#9900CC;">bytes</span>.<span style="color:#9900CC;">to_a</span>
  <span style="color:#CC0066; font-weight:bold;">p</span> decrypted.<span style="color:#9900CC;">bytes</span>.<span style="color:#9900CC;">to_a</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>



<p>結果、PKCS#5 の <a href="http://tools.ietf.org/html/rfc2898#section-6.1">PBES1</a>, <a href="http://tools.ietf.org/html/rfc2898#section-6.2">PBES2</a> と同じく <a href="http://tools.ietf.org/html/rfc1423">RFC 1423</a> で定義されたパディング処理を行っていることが分かった。このパディングアルゴリズムは一般には PKCS#5 Padding などと呼ばれているらしい。</p>
<p>PHP の mcrypt ライブラリと相互運用する場合は、PHP 側で適切に処理する必要がある。PHP Manual の User Contributed Notes に実装例を見つけた：<a href="http://jp2.php.net/manual/en/ref.mcrypt.php#69782">duerra_NOT_THIS_ at pushitlive dot net</a>。</p>
<p>一応実行結果も載せておく。見事に階段状になっていてちょっと面白い。<br />
<span id="more-432"></span></p>
<pre>
original message: A
[65]
[65, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15]

original message: AB
[65, 66]
[65, 66, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14]

original message: ABC
[65, 66, 67]
[65, 66, 67, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13]

original message: ABCD
[65, 66, 67, 68]
[65, 66, 67, 68, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12]

original message: ABCDE
[65, 66, 67, 68, 69]
[65, 66, 67, 68, 69, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11]

original message: ABCDEF
[65, 66, 67, 68, 69, 70]
[65, 66, 67, 68, 69, 70, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]

original message: ABCDEFG
[65, 66, 67, 68, 69, 70, 71]
[65, 66, 67, 68, 69, 70, 71, 9, 9, 9, 9, 9, 9, 9, 9, 9]

original message: ABCDEFGH
[65, 66, 67, 68, 69, 70, 71, 72]
[65, 66, 67, 68, 69, 70, 71, 72, 8, 8, 8, 8, 8, 8, 8, 8]

original message: ABCDEFGHI
[65, 66, 67, 68, 69, 70, 71, 72, 73]
[65, 66, 67, 68, 69, 70, 71, 72, 73, 7, 7, 7, 7, 7, 7, 7]

original message: ABCDEFGHIJ
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74]
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 6, 6, 6, 6, 6, 6]

original message: ABCDEFGHIJK
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75]
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 5, 5, 5, 5, 5]

original message: ABCDEFGHIJKL
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76]
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 4, 4, 4, 4]

original message: ABCDEFGHIJKLM
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77]
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 3, 3, 3]

original message: ABCDEFGHIJKLMN
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78]
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 2, 2]

original message: ABCDEFGHIJKLMNO
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1]

original message: ABCDEFGHIJKLMNOP
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80]
[65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]
</pre>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/432/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby による PBKDF2 実装</title>
		<link>http://wp.serpere.info/archives/427</link>
		<comments>http://wp.serpere.info/archives/427#comments</comments>
		<pubDate>Sun, 19 Apr 2009 11:36:05 +0000</pubDate>
		<dc:creator>tkyk</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[暗号]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=427</guid>
		<description><![CDATA[GitHubにて、PKCS#5 の PBKDF2 を Ruby で実装された方がいたので fork させていただいた。 tkyk&#8217;s pbkdf2-ruby at master &#8211; GitHub とりあえず Ruby 1.9 対応を行った。テスト（spec）は主にRFC 3962に基づいているようなので、併せて詳細を調べていく予定。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F427%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ruby%20%E3%81%AB%E3%82%88%E3%82%8B%20PBKDF2%20%E5%AE%9F%E8%A3%85%22%20%7D);"></div>
<p>GitHubにて、PKCS#5 の PBKDF2 を Ruby で実装された方がいたので fork させていただいた。</p>
<p><a href="http://github.com/tkyk/pbkdf2-ruby/tree/master">tkyk&#8217;s pbkdf2-ruby at master &#8211; GitHub</a></p>
<p>とりあえず Ruby 1.9 対応を行った。テスト（spec）は主に<a href="http://tools.ietf.org/html/rfc3962#page-6">RFC 3962</a>に基づいているようなので、併せて詳細を調べていく予定。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/427/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSSL::Cipher::Cipher#pkcs5_keyivgen の中身</title>
		<link>http://wp.serpere.info/archives/422</link>
		<comments>http://wp.serpere.info/archives/422#comments</comments>
		<pubDate>Thu, 16 Apr 2009 14:46:07 +0000</pubDate>
		<dc:creator>tkyk</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[暗号]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=422</guid>
		<description><![CDATA[結論から書くと、pkcs5_keyivgen に相当する処理を pure Ruby で実装すれば次のようになる。 def evp_bytes_to_key&#40;digest, key_len, iv_len, pass, salt=&#34;&#34;, count=2048&#41; total_len = key_len + iv_len return_buf = &#34;&#34; digest_buf = &#34;&#34; &#160; until return_buf.size &#62;= total_len digest_buf &#60;&#60; pass &#60;&#60; salt count.times &#123; digest_buf = digest.digest&#40;digest_buf&#41; &#125; return_buf &#60;&#60; digest_buf end return return_buf&#91;0,key_len&#93;, return_buf&#91;key_len,iv_len&#93; end まず Ruby のソースを find &#038; grep したところ、pkcs5_keyivgen の実装は [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F422%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSSL%3A%3ACipher%3A%3ACipher%23pkcs5_keyivgen%20%E3%81%AE%E4%B8%AD%E8%BA%AB%22%20%7D);"></div>
<p>結論から書くと、pkcs5_keyivgen に相当する処理を pure Ruby で実装すれば次のようになる。</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> evp_bytes_to_key<span style="color:#006600; font-weight:bold;">&#40;</span>digest, key_len, iv_len, pass, salt=<span style="color:#996600;">&quot;&quot;</span>, count=<span style="color:#006666;">2048</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  total_len = key_len <span style="color:#006600; font-weight:bold;">+</span> iv_len
  return_buf = <span style="color:#996600;">&quot;&quot;</span>
  digest_buf = <span style="color:#996600;">&quot;&quot;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">until</span> return_buf.<span style="color:#9900CC;">size</span> <span style="color:#006600; font-weight:bold;">&gt;</span>= total_len
    digest_buf <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> pass <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> salt
    count.<span style="color:#9900CC;">times</span> <span style="color:#006600; font-weight:bold;">&#123;</span> digest_buf = digest.<span style="color:#9900CC;">digest</span><span style="color:#006600; font-weight:bold;">&#40;</span>digest_buf<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    return_buf <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> digest_buf
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> return_buf<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,key_len<span style="color:#006600; font-weight:bold;">&#93;</span>, return_buf<span style="color:#006600; font-weight:bold;">&#91;</span>key_len,iv_len<span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>



<p>まず Ruby のソースを find &#038; grep したところ、pkcs5_keyivgen の実装は ext/openssl/ossl_cipher.c にあることが分かった。そのコードを注意深く読むと、実際の処理は openssl の EVP_BytesToKey という関数で行われていることが分かった。そこで次に openssl のソースを同様に調査したところ、crypto/evp/evp_key.c に実装があることが分かった。また OpenSSL のサイトで<a href="http://www.openssl.org/docs/crypto/EVP_BytesToKey.html">概要を記したドキュメント</a>も見つけた。これら手がかりから同等の処理を組み立てたのが上記の evp_bytes_to_key である。</p>
<p>その調査の過程で、pkcs5_keyivgen という名前は PKCS#5 という、「パスワードに基づく暗号化」を規定した標準規格に由来するということが分かった。しかし現在の Ruby の実装（つまり EVP_BytesToKey に基づく実装）は PKCS#5 の古いバージョン（v1.5）に、限定的に適合しているだけだということも分かった。PKCS#5 の最新のバージョンは2.0であり、Ruby 1.9 のソースコードにも、前出の<a href="http://www.openssl.org/docs/crypto/EVP_BytesToKey.html">ドキュメント</a>にも、今後は v2.0 を使うように、と注意書きがしてある。</p>
<p>その点から言うと<a href="http://wp.serpere.info/archives/401">先日のエントリ</a>の実行例は、PKCS#5 v2.0 は勿論のこと、v1.5 にさえ適合していない。なぜなら v1.5 ではハッシュ関数の出力長を超える長さの鍵を導出する方法は規定されていないからだ。その部分は EVP_BytesToKey の独自拡張という扱いになる。</p>
<p>この妥協によって、どのような用途でどのような脅威が生じ得るのかは、今の私にはちょっと計り難い。少なくとも、ビットが反転できるとか、暗号文が毎回同じになるとか、そういう分かりやすい現象は出てこない。しかし、それでも推奨されている方法があるのなら、できるだけそちらを使いたい。</p>
<p>ということで今度は PKCS#5 v2.0、すなわち RPC 2898 について調べていくことにする。</p>
<p>参考：</p>
<dl>
<dt><a href="http://d.hatena.ne.jp/winebarrel/20081208/p1">EVP_BytesToKeyをRubyで実装する &#8211; lambda {|diary| lambda { diary.succ! } }.call(hatena)</a></dt>
<dd>私と同じく Ruby で EVP_BytesToKey を実装している。こちらの方がC言語からのベタ移植に近い。</dd>
<dt><a href="http://tools.ietf.org/html/rfc2898">RFC 2898 &#8211; PKCS #5: Password-Based Cryptography Specification Version 2.0</a></dt>
<dd>PKCS#5 はもとは RSA 社の規格だったらしいが、現在は RFC にもなっている。和訳は、今のところは存在しないようだ。あと v1.5 の仕様も探したのだが、見つけられなかった。どうやら v2.0 の中に含まれているらしい。</dd>
</dl>
<p>最後に Ruby 実装版 EVP_BytesToKey の動作確認の方法を載せておく。オリジナルの pkcs5_keyivgen が生成した鍵と初期化ベクトルは見ることができないので、暗号文が全く同じになることで間接的に確認する。<br />
<span id="more-422"></span></p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Ruby 1.9.1</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> encrypt_proc<span style="color:#006600; font-weight:bold;">&#40;</span>cipher, msg<span style="color:#006600; font-weight:bold;">&#41;</span>
  enc = <span style="color:#6666ff; font-weight:bold;">OpenSSL::Cipher::Cipher</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>cipher<span style="color:#006600; font-weight:bold;">&#41;</span>
  enc.<span style="color:#9900CC;">encrypt</span>
  <span style="color:#9966CC; font-weight:bold;">yield</span> enc
  enc.<span style="color:#9900CC;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span>msg<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> enc.<span style="color:#9900CC;">final</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> run_test
  cipher = <span style="color:#996600;">'aes-256-cbc'</span>
  digest = <span style="color:#6666ff; font-weight:bold;">OpenSSL::Digest::MD5</span>
  msg  = <span style="color:#996600;">&quot;arcadia inferno&quot;</span>
  pass = <span style="color:#996600;">&quot;password&quot;</span>
  salt = <span style="color:#996600;">&quot;saltsalt&quot;</span>
  count= <span style="color:#006666;">2048</span>
&nbsp;
  original = encrypt_proc<span style="color:#006600; font-weight:bold;">&#40;</span>cipher, msg<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>enc<span style="color:#006600; font-weight:bold;">|</span>
    enc.<span style="color:#9900CC;">pkcs5_keyivgen</span><span style="color:#006600; font-weight:bold;">&#40;</span>pass, salt, count, digest.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  my_impl  = encrypt_proc<span style="color:#006600; font-weight:bold;">&#40;</span>cipher, msg<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>enc<span style="color:#006600; font-weight:bold;">|</span>
    k, i = evp_bytes_to_key<span style="color:#006600; font-weight:bold;">&#40;</span>digest,
                            enc.<span style="color:#9900CC;">key_len</span>,
                            enc.<span style="color:#9900CC;">iv_len</span>,
                            pass.<span style="color:#9900CC;">dup</span>.<span style="color:#9900CC;">force_encoding</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'ASCII-8BIT'</span><span style="color:#006600; font-weight:bold;">&#41;</span>,
                            salt,
                            count<span style="color:#006600; font-weight:bold;">&#41;</span>
    enc.<span style="color:#9900CC;">key</span>, enc.<span style="color:#9900CC;">iv</span> = k, i
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  original == my_impl
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">p</span> run_test  <span style="color:#008000; font-style:italic;">#=&gt; true</span></pre></div></div>



<p>一応、バイナリの処理であることを意識して force_encoding による変換を入れてある。パスワードに非 ASCII 文字を使う場合はこの変換がないと動かない。もちろん Ruby 1.8 ではこれを取り除かないと動かない。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/422/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rubyで共通鍵暗号（openssl）を使う</title>
		<link>http://wp.serpere.info/archives/401</link>
		<comments>http://wp.serpere.info/archives/401#comments</comments>
		<pubDate>Wed, 15 Apr 2009 13:41:04 +0000</pubDate>
		<dc:creator>tkyk</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[暗号]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=401</guid>
		<description><![CDATA[Ruby で共通鍵暗号を使用する場合、openssl ライブラリを使用するのが簡単らしい。 require 'openssl' &#160; def encrypt&#40;cipher, msg, pass&#41; salt = OpenSSL::Random.random_bytes&#40;8&#41; enc = OpenSSL::Cipher::Cipher.new&#40;cipher&#41; enc.encrypt enc.pkcs5_keyivgen&#40;pass, salt&#41; return enc.update&#40;msg&#41; + enc.final, salt end &#160; def decrypt&#40;cipher, crypt_msg, pass, salt&#41; dec = OpenSSL::Cipher::Cipher.new&#40;cipher&#41; dec.decrypt dec.pkcs5_keyivgen&#40;pass, salt&#41; dec.update&#40;crypt_msg&#41; + dec.final end 使用例： cipher = 'aes-256-cbc' #鍵長256ビットのAES &#160; msg = &#34;秘密のメッセージ&#34; pass = &#34;PASSWORD&#34; &#160; crypt, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F401%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ruby%E3%81%A7%E5%85%B1%E9%80%9A%E9%8D%B5%E6%9A%97%E5%8F%B7%EF%BC%88openssl%EF%BC%89%E3%82%92%E4%BD%BF%E3%81%86%22%20%7D);"></div>
<p>Ruby で共通鍵暗号を使用する場合、openssl ライブラリを使用するのが簡単らしい。</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'openssl'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> encrypt<span style="color:#006600; font-weight:bold;">&#40;</span>cipher, msg, pass<span style="color:#006600; font-weight:bold;">&#41;</span>
  salt = <span style="color:#6666ff; font-weight:bold;">OpenSSL::Random</span>.<span style="color:#9900CC;">random_bytes</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">8</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  enc  = <span style="color:#6666ff; font-weight:bold;">OpenSSL::Cipher::Cipher</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>cipher<span style="color:#006600; font-weight:bold;">&#41;</span>
  enc.<span style="color:#9900CC;">encrypt</span>
  enc.<span style="color:#9900CC;">pkcs5_keyivgen</span><span style="color:#006600; font-weight:bold;">&#40;</span>pass, salt<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> enc.<span style="color:#9900CC;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span>msg<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> enc.<span style="color:#9900CC;">final</span>, salt
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> decrypt<span style="color:#006600; font-weight:bold;">&#40;</span>cipher, crypt_msg, pass, salt<span style="color:#006600; font-weight:bold;">&#41;</span>
  dec = <span style="color:#6666ff; font-weight:bold;">OpenSSL::Cipher::Cipher</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>cipher<span style="color:#006600; font-weight:bold;">&#41;</span>
  dec.<span style="color:#9900CC;">decrypt</span>
  dec.<span style="color:#9900CC;">pkcs5_keyivgen</span><span style="color:#006600; font-weight:bold;">&#40;</span>pass, salt<span style="color:#006600; font-weight:bold;">&#41;</span>
  dec.<span style="color:#9900CC;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span>crypt_msg<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> dec.<span style="color:#9900CC;">final</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>



<p>使用例：</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">cipher = <span style="color:#996600;">'aes-256-cbc'</span>   <span style="color:#008000; font-style:italic;">#鍵長256ビットのAES</span>
&nbsp;
msg  = <span style="color:#996600;">&quot;秘密のメッセージ&quot;</span>
pass = <span style="color:#996600;">&quot;PASSWORD&quot;</span>
&nbsp;
crypt, salt = encrypt<span style="color:#006600; font-weight:bold;">&#40;</span>cipher, msg, pass<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">p</span> crypt.<span style="color:#9900CC;">unpack</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;H*&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">join</span>
<span style="color:#CC0066; font-weight:bold;">p</span> salt.<span style="color:#9900CC;">unpack</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;H*&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">join</span>
&nbsp;
msg2 = decrypt<span style="color:#006600; font-weight:bold;">&#40;</span>cipher, crypt, pass, salt<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">p</span> msg2</pre></div></div>



<p><a href="http://wp.serpere.info/archives/379">PHP + mcrypt の場合</a>と違って、鍵や初期化ベクトルを直接設定する必要はない（不可能というわけでは無い）。代わりに pkcs5_keyivgen メソッドを使って、パスワードとソルトから鍵と初期化ベクトルを生成する。</p>
<p>パスワードとソルトが揃っていないと復号できないので、ソルトは暗号文とともに転送・保存する必要がある。それ故にソルトは、毎回異なる安全な乱数でなければならない。しかし、ここが重要なところだが、秘密にしておく必要はない。<a href="http://wp.serpere.info/archives/362">初期化ベクトル</a>と違って、<strong>本当に</strong>秘密にしておく必要は無い。なぜならソルトだけでは鍵も初期化ベクトルも作り出せないし、ソルトを改竄しても平文を意図的に改竄することはできないからだ。</p>
<p>とても優れた仕組みだと思う。ただしその仕組みは、結局のところ pkcs5_keyivgen というただ一つのメソッドに立脚しているので、次はこのメソッドの詳細について調べてみたい。</p>
<p>参考：</p>
<dl>
<dt><a href="http://labs.unoh.net/2007/05/ruby.html">ウノウラボ Unoh Labs: rubyで手軽に暗号化文字列やハッシュ値を生成</a></dt>
<dd>参考にはなった…が、ソルトについて触れていないとか、パスワードのことをソルト（solt）と呼んでいるとか、hashの戻り値が文字列になっていないとか、突っ込みどころがいろいろある…。あと、2007年の記事なので仕方ないかもだが、Ruby 1.9 では動かない。</dd>
<dt><a href="http://doc.okkez.net/191/view/class/OpenSSL=Cipher=Cipher">class OpenSSL::Cipher::Cipher</a></dt>
<dd>Ruby 1.9.1 リファレンスマニュアル OpenSSL::Cipher::Cipher クラス</dd>
</dl>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/401/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Erlangと外部Rubyプログラムの連携</title>
		<link>http://wp.serpere.info/archives/180</link>
		<comments>http://wp.serpere.info/archives/180#comments</comments>
		<pubDate>Tue, 27 Jan 2009 14:56:04 +0000</pubDate>
		<dc:creator>tkyk</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[『プログラミングErlang』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=180</guid>
		<description><![CDATA[『プログラムErlang』12章、Cの代わりにRubyで書いてみた。極力ベタな移植を心がけたが、随所にRubyらしさを漂わせたつもり。 example1_driver.rb require './example1' require './example1_comm' &#160; def main&#40;&#41; begin loop do fun, *args = read_cmd&#40;&#41; &#160; result = case fun when 1 twice&#40;args&#91;0&#93;&#41; when 2 sum&#40;args&#91;0&#93;, args&#91;1&#93;&#41; end &#160; write_cmd&#40;&#91;result&#93;&#41; if result end rescue STDERR.puts&#40;&#34;finishied&#34;&#41; exit end end &#160; main&#40;&#41; example1_comm.rb def read_cmd&#40;&#41; len = read_exact&#40;2&#41;.unpack&#40;'n'&#41;.first read_exact&#40;len&#41;.unpack&#40;'C*'&#41; end &#160; def write_cmd&#40;cmds&#41; bin = &#40;&#91;cmds.size&#93; [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F180%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Erlang%E3%81%A8%E5%A4%96%E9%83%A8Ruby%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E9%80%A3%E6%90%BA%22%20%7D);"></div>
<p>『プログラムErlang』12章、Cの代わりにRubyで書いてみた。極力ベタな移植を心がけたが、随所にRubyらしさを漂わせたつもり。</p>
<p>example1_driver.rb</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'./example1'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'./example1_comm'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> main<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    <span style="color:#CC0066; font-weight:bold;">loop</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      fun, <span style="color:#006600; font-weight:bold;">*</span>args = read_cmd<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
      result = <span style="color:#9966CC; font-weight:bold;">case</span> fun
               <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006666;">1</span>
                 twice<span style="color:#006600; font-weight:bold;">&#40;</span>args<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
               <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006666;">2</span>
                 sum<span style="color:#006600; font-weight:bold;">&#40;</span>args<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>, args<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
               <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      write_cmd<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span>result<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> result
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span>
    STDERR.<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;finishied&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">exit</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
main<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>



<p>example1_comm.rb</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> read_cmd<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  len = read_exact<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">unpack</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'n'</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first</span>
  read_exact<span style="color:#006600; font-weight:bold;">&#40;</span>len<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">unpack</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'C*'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> write_cmd<span style="color:#006600; font-weight:bold;">&#40;</span>cmds<span style="color:#006600; font-weight:bold;">&#41;</span>
  bin = <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span>cmds.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">+</span> cmds<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">pack</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'nC*'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  write_exact<span style="color:#006600; font-weight:bold;">&#40;</span>bin, bin.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> read_exact<span style="color:#006600; font-weight:bold;">&#40;</span>len<span style="color:#006600; font-weight:bold;">&#41;</span>
  str = <span style="color:#996600;">&quot;&quot;</span>
  str <span style="color:#006600; font-weight:bold;">+</span>= STDIN.<span style="color:#9900CC;">sysread</span><span style="color:#006600; font-weight:bold;">&#40;</span>len<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">while</span> str.<span style="color:#9900CC;">size</span> <span style="color:#006600; font-weight:bold;">&lt;</span> len
  str
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> write_exact<span style="color:#006600; font-weight:bold;">&#40;</span>bin, len<span style="color:#006600; font-weight:bold;">&#41;</span>
  wrote = <span style="color:#006666;">0</span>
  wrote <span style="color:#006600; font-weight:bold;">+</span>= STDOUT.<span style="color:#9900CC;">syswrite</span><span style="color:#006600; font-weight:bold;">&#40;</span>bin<span style="color:#006600; font-weight:bold;">&#91;</span>wrote...<span style="color:#9900CC;">len</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">while</span> wrote <span style="color:#006600; font-weight:bold;">&lt;</span> len
  wrote
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>



<p>example1.rbはそのまんまなので省略。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/180/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
