パスワードを入力するとファイルを暗号化する簡単な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."
- (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: 相違点は検出されませんでした
参考
- 画面表示(エコーバック)なしのパスワード入力は、Ruby CookbookおよびC:\ruby\lib\ruby\gems\1.8\gems\highline-1.5.0\examples\password.rbを参考にしました。
- Rijndaelで遊ぶ