【OpenSSL】OpenSSLでファイルを暗号化・復号化

1 はじめに

本記事は、Windowsで、無料で使える
OpenSSL を使ってのファイルの暗号化について 整理したものです。

似たようなソフトウェアに、 PGP(Pretty Good Privacy) があります。
OpenSSLPGPは、どちらもファイルの暗号化に使用できるツールです。

ファイルの暗号化関する操作は、PGPの方が圧倒的に使いやすいと思います。
ですが、OpenSSLはファイルの暗号化の他にも便利な使い方がありそうで、
ファイルの暗号化をきっかけにOpenSSLを学ぶために敢えてこの記事を起こしてみました。

なお、PGPによる、ファイルの暗号化については、次のページをご覧いただければと思います。

【OpenPGP】メール暗号化のためのPGP導入が、とっても簡単になっていた!
(有料サービスにも負けない、無料の 脱PPAP最強解) | dotいがの快適インターネット

参考として、OpenSSLPGPによるファイルの暗号化の違いを下に示します。

【暗号化方式】

OpenSSL
主に対称鍵暗号と非対称鍵暗号の両方をサポートしています。
対称鍵暗号では同じ鍵を使って暗号化と復号を行い、
非対称鍵暗号では公開鍵で暗号化し、対応する秘密鍵で復号します。
PGP
非対称鍵暗号を基本にしており、ユーザーは公開鍵と秘密鍵のペアを生成します。
ファイルは受信者の公開鍵で暗号化され、受信者のみが自分の秘密鍵で復号できます。

【用途】

OpenSSL
一般的にはSSL/TLSプロトコルに関連した通信のセキュリティや、ファイルの暗号化、
証明書の管理など、幅広い用途に使用されます。
PGP
主に電子メールやファイルの暗号化、デジタル署名に特化しています。
特にプライバシー保護を重視した用途で広く使われています。

【ユーザー管理】

OpenSSL
鍵の管理はユーザーが手動で行う必要があり、証明書の発行や管理も自分で行います。
PGP
公開鍵サーバーを利用して、他のユーザーと公開鍵を交換することが容易です。
また、信頼関係の管理ができる「ウェブオブトラスト」モデルが特徴です。

【使用の難易度】

OpenSSL
コマンドラインベースで操作するため、初心者には少し敷居が高い場合があります。
PGP
専用のソフトウェア (例: Gpg4Win) を使うことで、比較的簡単に暗号化が行えます。

2 Windows 11へのOpenSSLインストール

2.1 Windows向けOpenSSLの入手とインストール

Windows向けOpenSSLは、本家の OpenSSLから入手することができなく、
下に示すページから入手します。

https://slproweb.com/products/Win32OpenSSL.html

2025/04/01現在の最新のバージョンは“v3.4.1”ですが、
このページからは旧バージョンのものをダウンロードできるようになっています。

Win32Win64ARMExperimental向けと、EXE形式、MSI形式と、
いくつかのパッケージの中から選べるようになっています。

特別な理由がなければ、Win64 / MSIのパッケージを選ぶと良いでしょう。

2.2 事前にC++再配布可能パッケージをインストール

Win32/Win64 OpenSSL」を利用するには、「Microsoft Visual C++ 再配布可能パッケージ」が
インストールされていなければなりません。

他のアプリの要求で既にインストール済みであるケースが多いのですが、一応気に留めておいてください。

Microsoft Visual C++ 再配布可能パッケージは、次のページから取得することができます。

最新の Microsoft Visual C++ 再頒布可能パッケージ バージョン

ちなみに、Microsoft Visual C++ 再配布可能パッケージがインストールされていない場合、
以下に示すようなエラーが発生します。

1. アプリケーションの起動エラー
特定のアプリケーションを起動しようとすると、
このアプリケーションを正しく起動できませんでした」や
エラーが発生しました
などのメッセージが表示されることがあります。

2. DLLエラー
特定のDLLファイル(例: MSVCR*.dllやMSVCP*.dllなど)が見つからない、
またはロードできないというエラーが表示されることがあります。

3. クラッシュ
アプリケーションが実行中に突然クラッシュし、
プログラムが応答しません」というメッセージが表示されることがあります。

2.3 インストールに際して

本記事では、OpenSSLインストールの全ステップは示しませんが、
インストール途中いくつか注意すべき選択がありますので、それらについてだけ示します。

・ DLLの格納先
OpenSSL開発元への寄付

2.3.1 DLLの格納先

OpenSSLのDLLの格納先を、“The OpenSSL binaries (/bin) directory”に変更します。
アプリ固有のDLLをシステムフォルダに格納すると、トラブルの原因になる可能性があります。

2.3.2 OpenSSL開発元への寄付

図2.3-2は、OpenSSLの開発元に対する寄付を募る画面です。
デフォルトで先頭にチェックが入っていますが、チェックを外して問題ありません。

2.4 Pathを通す

OpenSSLは、コマンドプロンプトで利用します。

コマンドプロンプトで直ちに利用ができるよう、
環境変数“Path”にOpenSSL実行ファイルのパスを追加します。

環境変数名の編集」において、「システム環境変数」区画(pane)の“Path”に追加します。
自分のアカウントのみOpenSSLを利用したい場合は、
ユーザー環境変数」区画の“Path”に追加します。

3 ファイルの暗号化

OpenSSLにはたくさんのサブコマンドがありますが、
ファイル暗号化に使えるサブコマンドとその特徴を表3-1に示します。

3.1 openssl-enc

共通鍵でファイルの暗号化・復号を行うコマンドです。

暗号化に使用する鍵はパスワードから導出されますが、
別途鍵ファイルIV(初期化ベクトル)などを直接指定するような使い方も可能です。

3.1.1 よく使われるオプション

表3.1-1に“enc”の主要なオプションを示します。

その他のオプションについては、次のページでご確認ください。
openssl-enc | OpenSSL Documentation

3.1.2 暗号化アルゴリズム(Cipher Type)

暗号化アルゴリズムとしては、 DESDES3AES128AES256 などがあります。
最近では、AES256が使われる場合が多いようです。

OpenSSLで利用可能な暗号化アルゴリズムは、多数あります。
ここで全てを列挙できませんので、図3.1-1に示すよう“-ciphers”オプションで確認してください。

3.1.3 暗号化と復号化の例

【暗号化】
下に示すコマンドは、“foo.txt”というファイルをAES256アルゴリズムで暗号化し、
“encrypted_foo.dat”ファイルとして保存する例です。

PS C:\> openssl enc -aes256 -pbkdf2 -md sha-256 -in foo.txt -out encrypted_foo.dat

【復号化】
下に示すコマンドは、encrypted_foo.dat”というファイルを復号化し、
“decrypted_foo.txt”ファイルとして保存する例です。

PS C:\> openssl enc -d -aes256 -pbkdf2 -md sha-256 -in encrypted_foo.dat -out decrypted_foo.txt

パスワードの指定については、表3.1-2に示す方法があります。

【コマンドライン・オプションで指定】

PS C:\> openssl aes-256-cbc -e -in in_sample.txt -out out_sample.txt -pass pass:hoge

【ファイルから指定】

PS C:\> openssl aes-256-cbc -e -in in_sample.txt -out out_sample.txt -pass file:./password.txt

3.2 openssl cms

S/MIME 3.1に 準拠したメッセージの暗号化・復号化・署名・署名検証のためのコマンドです。
公開鍵で暗号化し、秘密鍵で復号化を行います。

ファイル暗号化というよりはメールの暗号化や署名のための機能ですが、
ファイルの暗号化機能として利用することも可能です。

cms”でファイルを暗号化するには、
前もって秘密鍵(key.pem)と X.509証明書(cert.pem)を作成しておく必要があります。

3.2.1 よく使われるオプション

表3.2-1表3.2-2に “cms”の主要なオプションを示します。

その他のオプションについては、次のページでご確認ください。
openssl-cms | OpenSSL Documentation

3.2.2 前準備: 秘密鍵と証明書の作成

本項では、RSA秘密鍵(key.pem)と X.509証明書(cert.pem)を作成する手順を
簡単に示します。

OpenSSLは、はたくさんの暗号化アルゴリズムをサポートしていますが、
本記事では AES256 を採用した場合で示します。

下に示す例において、証明書生成の“/CN=hoge”の“hoge”の部分は、
証明書のCommon Nameです。
自分のアカウント名などにすればよいでしょう。
ちなみに、Webサーバー用の証明書の場合はドメイン名にします。

# 秘密鍵の生成
PS C:\> openssl genrsa -aes256 -out key.pem 4096
 
# 証明書の生成(自己署名証明書)
# "hoge"の部分は自分のアカウント名などにします
PS C:\> openssl req -new -x509 -key key.pem -out cert.pem -days 36500 -subj "/CN=hoge"
 
# 証明書の内容の確認
PS C:\> openssl x509 -in cert.pem -noout -subject -dates

RSA秘密鍵生成のための“openssl genrsa”コマンドの詳細については、
次のページをご覧ください。
genrsa | OpenSSL Documentation

証明書生成のための“openssl req”コマンドの詳細については、次のページをご覧ください。
openssl-req | OpenSSL Documentation

3.2.3 暗号化と復号化の例

【暗号化】
下に示すコマンドは、“cert.pem”という証明書を使って、“foo.txt”を暗号化し、
“encrypted_cms_foo.txt“として保存する例です。

PS C:\> openssl cms -encrypt -aes256 -in foo.txt -out encrypted_cms_foo.txt cert.pem

【復号化】
次のコマンドは“key.pem”という秘密鍵を使用し、“encrypted_cms_foo.txt”を復号化し、
“decrypted_cms_foo.txt”として保存する例です。

PS C:\> openssl cms --decrypt -inkey key.pem -in encrypted_cms_foo.txt
-out decrypted_cms_foo.txt

【暗号化されたファイル】
openssl cmsで暗号化されたファイルの中身は、下に示すようなテキストファイルになります。

いくつかのヘッダBase64エンコードされたペイロードで構成されています。

3.3 openssl smime

サブコマンドの“cms”が“smimeになっただけで、openssl cmsと使い方は同じです。

コマンド使用例は、割愛します。

以上

本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。
少しでも役に立てていただければ、うれしく思います。

このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元著者名は明らかにしてください

なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。

お問い合わせ