このようなタスクには、信頼できるクロスプラットフォームソリューションであるOpenSSLが非常に適しています。 OpenSSLはさまざまな暗号化アルゴリズムをサポートし、さらに多くのオペレーティングシステムにデフォルトでインストールされます。残りのインストールは簡単です。
Habrakatの下-OpenSSLで対称および非対称暗号化を使用する基本、およびワンタイムキーによる非対称暗号化を簡素化するいくつかのスクリプト。
OpenSSLでデータを保護する最も簡単な方法は、対称暗号化です。 次のコマンドは、256ビットのキー長のAESアルゴリズムを使用して、documents.zipファイルを暗号化および復号化します。
openssl enc -aes-256-cbc -salt -in documents.zip -out documents.enc
openssl enc -d -aes-256-cbc -in documents.enc -out documents.zip
これらのコマンドの問題は、パスワードが必要なことです。 これが望ましくない状況があります。 たとえば、スケジュールに基づいたデータの自動バックアップ/暗号化、またはある人がデータを暗号化し、別の人がデータを復号化する場合。
そのような場合のために、 公開鍵暗号化が発明されました。 一般に、公開鍵と秘密鍵を作成する必要があります。 最初のコマンドはprivate.pem秘密キーを生成し、2番目のコマンドはpublic.pem公開キーを作成します。
openssl genrsa -out private.pem -aes256 2048
openssl rsa -in private.pem -pubout -out public.pem
その結果、2048ビットの長さのRSAキーのペアを取得します。 残念ながら、RSAシステムでは、暗号化されたデータのサイズはキーサイズによって制限されるため、2 KBを超えるデータの暗号化は失敗します。 これを回避する方法があります-情報は、最初にワンタイムキーを使用して(上記で使用したような)対称アルゴリズムで暗号化されます。 その後、このワンタイムキーは公開キーで暗号化されます。 復号化するとき、ワンタイムキーはプライベートとして復号化されます。 これに関する詳細はすでにHabréの記事で非常によく書かれています 。
次のスクリプトは、暗号化を自動化するのに役立ちます。その出力では、ワンタイムキーとデータ(encrypt.sh)を暗号化された形式で受け取ります。
# !/bin/bash
FILENAME="$1"
PUBLICKEY="$2"
SESSIONKEY="$3"
RESULT="$4"
# Generate the random symmetric-key
PASSIZE=30
if [ -c /dev/urandom ] ; then
KEY=`head -c 30 /dev/urandom | openssl enc -base64`
else
KEY=`openssl rand -base64 30`
fi
export KEY
# Encrypt the symmetric key using the public key
openssl rsautl -encrypt -inkey "$PUBLICKEY" -out "$SESSIONKEY" -pubin <<EOF
$KEY
EOF
# Encrypt the file
openssl enc -aes-256-cbc -pass env:KEY -in "$FILENAME" -out "$RESULT"
次のコマンドは、public.pem公開キーを使用して、documents.zipファイルを暗号化します。 暗号化されたワンタイムキーsession.keyと暗号化されたデータdocuments.encを生成します。
./encrypt.sh documents.zip public.pem session.key documents.enc
復号化スクリプト(decrypt.sh):
# !/bin/bash
PRIVATEKEY="$1"
SESSIONKEY="$2"
ENCRYPTED="$3"
DECRYPTED="$4"
# Decrypt the symmetric key using the private key
KEY=` openssl rsautl -decrypt -inkey "$PRIVATEKEY" -in "$SESSIONKEY" `
export KEY
# Decrypt the file
openssl enc -aes-256-cbc -d -pass env:KEY -in "$ENCRYPTED" -out "$DECRYPTED"
復号化コマンドは、private.pem秘密鍵とsession.keyワンタイムキーを使用して、documents.encファイルを復号化します。 documents.zipファイルが生成されます。
./decrypt.sh private.pem session.key documents.enc documents.zip
ご覧のとおり、公開キーの暗号化は対称とほぼ同じくらい簡単です。 しかし、さらに簡単な方法があります。 SbF₅ブログは私にこの投稿を書くよう促しました。 その著者(間違いなく私よりもbashの方が洗練されています)は、フォルダーをアーカイブし、公開キーで暗号化して、必要なものすべてを含む別のスクリプトを生成するスクリプトを作成しました:ワンタイムキー、データ、および復号化のための実際のコマンド。 さらに、スクリプトはRSAキーのペアを生成できます。
./encrypt-file.sh -keys public.pem private.pem
./encrypt-file.sh folder public.pem > decrypt-folder.sh
chmod +x decrypt-folder.sh
./decrypt-folder.sh private.pem > folder.tar
この例では、最初にキーペアを生成しました。 その後、フォルダーフォルダーは、decrypt-folder.shスクリプトに暗号化され、folder.tarアーカイブに復号化されました。 この方法のマイナス面は、decrypt-folder.shのデータがBASE64形式で保存されるため、サイズが大きくなることです。
実際、それは私が共有したかったものです。 誰かがコメントや質問を持っている場合-コメントに書いて、私は答えようとします。
UPDは情報セキュリティブログに移動しました。