5

相互運用可能な暗号化システムをセットアップしようとしているときに、軽い「概念実証」中に奇妙な状況に遭遇しました。

私はRubyで次のコードを書きました:

  • ファイルシステム上のダミーテキストファイルから暗号化されたファイルを作成します
  • 暗号化されたファイルを復号化する
  • 元のファイルと比較して、同じかどうかを確認します

コードは次のとおりです。

require 'openssl'
require 'base64'

# Read the dummy file
data = File.read("test.txt")

# Create an encrypter
cipher = OpenSSL::Cipher::AES.new(256, :CBC)
cipher.encrypt
key = "somethingreallyreallycomplicated"
cipher.key = key

# Encrypt and save to a file
encrypted = cipher.update(data) + cipher.final
open "encrypted.txt", "w" do |io| io.write Base64.encode64(encrypted) end

# Create a decrypter
decipher = OpenSSL::Cipher::AES.new(256, :CBC)
decipher.decrypt
decipher.key = key

# Decrypt and save to a file
encrypted_data = Base64.decode64(File.read("encrypted.txt"))
plain = decipher.update(encrypted_data) + decipher.final
open "decrypted.txt", "w" do |io| io.write plain end

# Compare original message and decrypted message
puts data == plain #=> true

すべてが正常に機能し、このスクリプトは「true」を出力します

次に、opensslコマンドラインを使用して、次のコマンドでファイルを復号化しようとしました。

openssl aes-256-cbc -d -a -in encrypted.txt -k somethingreallyreallycomplicated

しかし、私は得ました:bad magic number

どうして?

4

1 に答える 1

6

キーとIVを16進数の文字列として明示的に指定するには、コマンドラインで-K(大文字)とオプションを使用する必要があります。(小文字)-ivを使用する場合、OpenSSLは鍵導出関数を使用してパスワードから鍵とIVを導出します。-kOpenSSLがキーを取得するとき、期待しているプレーンなブロック単位のCBCと互換性のない「ソルト」暗号文形式も使用します。

Rubyコードでは、ASCII文字列の最初の256ビット(32バイト)をキーとして直接使用していることに注意してください。これは、セキュリティが問題となる実際のアプリケーションに必要なものではないことはほぼ間違いありません。(ランダムに生成された)バイナリキーを使用するか、 PBKDF2bcryptscryptなどのキー導出関数を使用してパスワードからキーを導出する必要があります。

于 2013-01-30T11:57:42.463 に答える