パスワードを入力するとファイルを暗号化する簡単なRubyスクリプト

新版暗号技術入門――秘密の国のアリス』が刊行されたので、暗号関連のプログラムを作りたくなりました。
以下、パスワードを入力するとファイルを暗号化する簡単なRubyスクリプトを紹介します。
1. cryptをインストールします。

C:\work> gem install crypt
Successfully installed crypt-1.1.4

2. highlineをインストールします。

C:\work> gem install highline
Successfully installed highline-1.5.0
Installing ri documentation for highline-1.5.0...
Installing RDoc documentation for highline-1.5.0...

3. 以下のファイルrjtest.rbを作成します。

require "rubygems"
require 'highline/import'
require 'crypt/rijndael'

File.open('plain.txt', 'wb') do |f|
  f.print <<-'EOD'
結城浩『新版暗号技術入門――秘密の国のアリス』は、複雑に絡み合う暗号技術を
たくさんの図と やさしい文章で ていねいに解説した入門書です。
対称暗号、公開鍵暗号、デジタル署名、一方向ハッシュ関数、
メッセージ認証コード、擬似乱数生成器、PKI、PGP、SSL/TLSといった
現代の暗号技術を解きほぐしていきます。
詳しくは、http://www.hyuki.com/cr/ を参照してください。
  EOD
end
puts "plain.txt is created."

def password(prompt = 'Password?')
  ask(prompt) { |q| q.echo = false }
end

encrypt = Crypt::Rijndael.new(password('Enter password to encrypt: '));
encrypt.encrypt_file('plain.txt', 'encrypt.bin')
puts "encrypt.bin is created."

decrypt = Crypt::Rijndael.new(password('Enter password to decrypt: '));
decrypt.decrypt_file('encrypt.bin', 'decrypt.txt')
puts "decrypt.txt is created."

このRubyスクリプトは、以下の動作を行います。

  • (1) plain.txtというテキストファイルを作る。
  • (2) ユーザからパスワードを受け付ける。
  • (3) そのパスワードを使ってplain.txtを暗号化し、encrypt.binというファイルを作る。
  • (4) ユーザから再度パスワードを受け付ける。
  • (5) そのパスワードを使ってencrypt.binを復号化(復号)し、decrypt.txtというファイルを作る。

もちろん、(2)と(4)のパスワードが一致しなければ、decrypt.txtはplain.txtと等しいファイルにはなりません。
実行結果です。

C:\work> ruby rjtest.rb
plain.txt is created.
Enter password to encrypt:              ←ここでパスワードを入力(画面表示なし)
encrypt.bin is created.
Enter password to decrypt:              ←ここで再度パスワードを入力(画面表示なし)
decrypt.txt is created.
C:\work> fc /b plain.txt decrypt.txt    ←Windowsのfcコマンドを使ってファイルを比較
ファイル plain.txt と DECRYPT.TXT を比較しています
FC: 相違点は検出されませんでした

参考