OpenSSL を使用して暗号化したファイルを、 Ubuntu 20.04 で複合化しようとすると、bad magic number
のエラーが発生して複合化できませんでした。
暗号化を実行した環境は不明です。
また、Ubuntu 20.04 で暗号化したファイルを、Windows 10 で複合化すると、複合化したファイルの1行目が文字化けしていました。
暗号化のコマンドは以下のとおりです。
SALT=0000000000000000
IN=test.txt
OUT=test.enc
openssl aes-256-cbc -e -base64 -pbkdf2 -S $(SALT) -in $(IN) -out $(OUT)
やりたいこと
この問題が発生したプロジェクトでは、メンバーが各自の好きな環境を利用して開発していました。
そのため、OS やライブラリーのバージョンに依存しない暗号化/複合化の手段を提供する必要がありました。
考えられる原因
Web検索で、考えられる原因が2つ出てきました。
-
ダイジェストアルゴリズムが異なる。
OpenSSL は 1.1.0 を境にダイジェストアルゴリズムのデフォルト値が md5 から sha256 に変更されています。
OpenSSL のバージョンに依存させないためには、-md
オプションでダイジェストアルゴリズムを明示してあげる必要がありそうです。 -
Windows 10 の base64 時の改行コード変換が悪さしている。
-base64
または-a
を指定しないでファイルを暗号化すると、暗号化されたファイルはバイナリー形式になります。 暗号化/複合化時にBase64エンコード/デコードする際に echo が利用されるらしいのですが、Windows の改行コードは CRLF のため、改行コードの差異が悪さをしているかもしれません。また、SALT利用時は暗号化ファイルの先頭に
Salted__
が付与されるのですが、改行コードの違いによりSalted_
の付与がうまくいっていないかもしれません。そのため、SALTを利用しない方法で上手くいくか検討してみる価値はあるかなと考えました。
解決方法
最終的に、暗号化のコマンドは以下になりました。
IV=00000000000000000000000000000000
IN=test.txt
OUT=test.enc
openssl aes-256-cbc -e -base64 -pbkdf2 -md sha256 -nosalt -iv $(IV) -in $(IN) -out $(OUT)
このコマンドによるファイルの暗号化 → 複合化は、以下の環境で成功することを確認しています。
- Mac 12.3 (OpenSSL 3.0.2)
→ Ubuntu 20.04 (OpenSSL1.1.1f / ホストOSが Mac のDocker) - Windows 10 (OpenSSL 3.0.1)
→ Ubuntu 20.04 (OpenSSL 1.1.1f / ホストOSが Windows 10 の Docker) - Windows 10 (OpenSSL 3.0.1)
→ Ubuntu 20.04 (OpenSSL 1.1.1f / Azure VM) - Ubuntu 20.04 (OpenSSL 1.1.1f / Azure VM)
→ Windows 10 (OpenSSL 3.0.1) - Ubuntu 20.04 (OpenSSL 1.1.1f / Azure VM)
→ MacBookPro17 (OpenSSL 3.0.2)
注意 : Mac の場合
Mac に標準でインストールされている LibreSSL はオプションが異なるため、解決方法に提示したコマンドはそのまま利用できません。
% openssl version
LibreSSL 2.8.3
そのため、OpenSSL を別途インストールする必要があります。