RubyでAES256暗号/復号を書いてみる - Rubyで暗号化の自主学習①

ブロックチェーンの勉强をしていると何かと暗号化の話が多く出てきます。

日本ブロックチェーン協会(JBA)によると、ブロックチェーンという言葉は以下のように定義されています。

------

1)「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」

1) A blockchain is defined as a protocol, or implementation of a protocol, used by an unspecified number of nodes containing Byzantine faults, and converges the probability of consensus reversion with the passage of time to zero.

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

2) In a broader sense, a blockchain is a technology with a data structure which can easily detect manipulation using digital signatures and hash pointers, and where the data has high availability and integrity due to distribution across multiple nodes on a network.

出典: https://jba-web.jp/archives/2011003blockchain_definition

----

この"電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち"という部分を担うために様々な暗号化技術が使われているようです。


実際に手を動かしながらだと内容の理解も深まると思うので、これから何回かに分けてRubyを使って暗号技術の実装をしてみます。今回はAES256方式です。


Rubyには様々な暗号化システムを提供しているOpenSSLライブラリというものがあります。これを使ってAES256暗号を実装していきます。

  1. OpenSSL::Chipher::AES256.newでオブジェクトを生成します。
  2. object.encryptとすることで暗号化モードに設定出来ます。
  3. AES256暗号方式では16byteの初期化ベクトルと32byteの共通鍵を使用します。
  4. 暗号済みテキストの生成はcipher.update(data) + cipher.finalで行います。

  1. 復号化も同じようにオブジェクトを生成します。
  2. decipher.decryptで復号モードに設定します。
  3. decipher.ivに先程設定していた初期化ベクトルを設定します。
  4. decipher.keyに先程使った共通鍵を設定します。
  5. テキストの復号化に関してはdecipher.update(data) + decipher.finalで行います。

実行結果です。


暗号化した後のテキストは初期化ベクトルによって変わってくるのが一回目とニ回目の実行結果でわかります。これは、同じ平文が毎回同じ暗号文に暗号化されないようにするために使用されます(もし同じ平文が同じ暗号文に暗号化されてしまうと頻出度等から推測出来てしまう可能性があります)。


今回は共通鍵暗号のひとつであるAES-256を書いてみました。次回は公開鍵暗号についてて勉强します。


ちなみに、"ես սիրում եմ քեզ"はアルメニア語で"I Love you"という意味らしいです。暗号化してもしなくても僕には読めません。