Rubyでファイルを暗号化し、それを復号したいのですがうまくいかないため、
質問させていただきます。
Ruby 1.9.3を使用しています。
・ファイルの暗号化 encrypt.rb
-------------------------------------------------
# encoding: cp932
require 'openssl'
def encrypt(file, pass)
enc = OpenSSL::Cipher::AES256.new('CBC')
enc.encrypt
enc.pkcs5_keyivgen(pass)
File.open(file, 'rb') do |fin|
File.open("#{file}.sec", 'wb') do |fout|
while buff = fin.read(8000)
fout.write(enc.update(buff))
end
fout.write(enc.final)
end
end
enc.reset
end
if $*.length > 0
print 'password: '
pass = $stdin.gets.chomp
$*.each do |arg|
begin
encrypt(arg, pass)
puts "#{arg}を暗号化したファイル#{arg}.secを作りました。"
rescue
puts "#{arg}の暗号化に失敗しました。"
end
end
0.upto(pass.length - 1) do |i|
pass[i] = '\xff'
end
end
-------------------------------------------------
・ファイルの復号 decrypt.rb
-------------------------------------------------
# encoding: cp932
def decrypt(file, pass)
dec = OpenSSL::Cipher::AES256.new('CBC')
dec.decrypt
dec.pkcs5_keyivgen(pass)
File.open(file, 'rb') do |fin|
File.open("#{file}.plain", 'wb') do |fout|
while buff = fin.read(512)
fout.write(dec.update(buff))
end
fout.write(dec.final)
end
end
dec.reset
end
if $*.length > 0
print 'password: '
pass = $stdin.gets.chomp
$*.each do |arg|
begin
decrypt(arg, pass)
puts "#{arg}を復号したファイル#{arg}.plainを作りました。"
rescue
puts "#{arg}の復号に失敗しました。"
end
end
0.upto(pass.length - 1) do |i|
pass[i] = '\xff'
end
end
-------------------------------------------------
コマンドプロンプトでencrypt.rb自身を暗号化し、encrypt.rb.secの作成はできるのですが、
decrypt.rbを実行してパスワードを入力しても復号ができません。
どのようにすれば復号できるのか教えていただけますでしょうか。
No.1ベストアンサー
- 回答日時:
ファイルの復号 decrypt.rb
のほうですが、
require 'openssl'
が抜けています。
# encoding: cp932
の次の行へ
require 'openssl'
を追加してください。
この回答への補足
回答ありがとうございます。
無事、ファイルを復号することができました。
もう一点、教えていただきたいのですが、
暗号化の際にAES256クラスを使用した場合、キー長は256ビットとなるのですが、
例えばパスワードを'abc'としても暗号化することができました。
パスワードはキーと同じものだと考えていたのですが、
そうであればパスワードの長さも記号と英数字合わせて32バイトにする必要はないのでしょうか。
No.2
- 回答日時:
> パスワードはキーと同じものだと考えていたのですが、
いいえ、(少なくともこの例では)違います。
instance method OpenSSL::Cipher#pkcs5_keyivgen
http://docs.ruby-lang.org/ja/2.0.0/method/OpenSS …
上記ページに記載されているとおり
pkcs5_keyivgenメソッドは
pass(と指定されていればsalt)からキーとIVを生成します。
passをそのままキーにしているわけではありません。
再度回答いただきありがとうございます。
パスワードがそのままキーになっているわけではないため、
パスワードが'abc'でも暗号化することができたのですね。
リファレンスマニュアルを見て、さらに勉強していきたいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Fortran:列数の分からないデー...
-
pythonのエラーについて
-
fortranでNAのあるデータを読み...
-
Excelマクロ 空白セルを無視し...
-
【ExcelVBA】300万件越えCSVか...
-
バッチ処理 特定の文字以降を...
-
エクセルの任意のシートをcs...
-
C# ファイルを読み込みlistvie...
-
VB.netでShellExecuteがしたい
-
StringGridの中身をCSV形式で保...
-
[コンパイルエラー 修飾子が不...
-
シート内容の文字列を置換してV...
-
ダブルコーテーション付きでCSV...
-
pythonでリストをCSVに出力する...
-
VBAでcsvファイルもシートもあ...
-
VBAで複数のCSVからレコードセ...
-
CSVデータの文字列置換
-
LibreOffice Calcのマクロで、...
-
VBAで文字列を引数とするアドイ...
-
FileListBoxで出すものを絞り込...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonのエラーについて
-
pycharmへのpysamインストール...
-
fortranでNAのあるデータを読み...
-
Fortran:列数の分からないデー...
-
【fortran77】空行を含む数値デ...
-
区切り文字の調整方法について...
-
【ruby】flockで掛けたロックを...
-
rubyの見えない文字
-
2次元Hashのkeyチェック方法
-
Ruby 暗号化したファイルの復号...
-
ギャスケット作成。修正の解説...
-
Excelマクロ 空白セルを無視し...
-
バッチ処理 特定の文字以降を...
-
【ExcelVBA】300万件越えCSVか...
-
ダブルコーテーション付きでCSV...
-
VBAでcsvファイルもシートもあ...
-
パイソンでテキストファイルが...
-
VBA テキストボックスを選択状...
-
CSVで余計な空行が入る
-
EXCEL→CSV保存時のダブルクォー...
おすすめ情報