OpenSSL:シンプルな公開キー暗号化

特定のファイルまたはフォルダーを暗号化する必要がある場合は、状況がいっぱいです。 たとえば、データが開いているチャネルを介して送信されたり、外部メディアに保存されたりする場合。 多くの人(自分を含む)はtruecryptを使用しますが、このプログラムの主な目的は暗号化されたパーティションを操作することです。したがって、この場合はあまり良くありません。



このようなタスクには、信頼できるクロスプラットフォームソリューションである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は情報セキュリティブログに移動しました。




All Articles