web-dev-qa-db-ja.com

秘密鍵でファイルを暗号化する方法

ファイルを秘密鍵で暗号化し、公開鍵で復号化したい。公開鍵は私のアプリに埋め込まれます。だから私はファイルが私によって作成されたことを保証したいです。どのようにgpgまたはopensslを使用して実装できますか?.

1
rewardealer

ファイルを秘密鍵で暗号化しても意味がありません

秘密鍵を使用してタグをファイルに添付すると、そのファイルが秘密鍵の所有者によって提供されたことを保証できますsigning、タグはsignatureと呼ばれます。

単純化された(安全でない)アルゴリズムが使用する同じタイプの公開鍵と秘密鍵を使用する人気のある暗号システム(教科書RSA)が1つあり、復号化は署名と同じで、暗号化は検証と同じです。これは一般的なケースではありません。RSAでも、適切で安全なパディングモードを使用して、復号化と署名(暗号化と検証)に異なるメカニズムを使用します。そして、他の多くのアルゴリズムには、同じ種類の数学的オブジェクトでさえない秘密鍵と公開鍵があります。

したがって、ファイルに署名する必要があります。このための事実上の標準ツールは GnuPG です。

秘密鍵でファイルに署名するには:

gpg -s /path/to/file

秘密鍵が複数ある場合は、--local-userオプションを使用して秘密鍵を選択します(アプリの鍵と個人の鍵など)。

ファイルを使用する場所にfile.gpgを転送します。公開鍵も転送します(おそらくアプリケーションバンドル内にあります)。元のテキストを抽出して署名を検証するには、次を実行します。

gpg file.gpg

より便利な場合は、file自体を転送し、分離署名と呼ばれる別の署名ファイルを作成できます。切り離された署名を生成するには:

gpg -b /path/to/file

検証します:

gpg file.gpg file

さらに、-eオプションを使用してファイルを暗号化できます。もちろん、これは、受信者(-rオプションで指定)が秘密鍵を持ち、プロデューサーが公開鍵を持つ、別個の鍵ペアが必要であることを意味します。

それにはOpenSSLを使用します。簡単な例に従ってください:

ファイルを暗号化するには:

openssl rsautl -encrypt -inkey public_key.pem -pubin -in <decrypted file> -out <encrypted file>

ファイルを復号化するには:

openssl rsautl -decrypt -inkey private_key.pem -in <encrypted file> -out <decrypted file>
8

あなたはアプリについて話している。つまり、コマンドラインではなく、ライブラリを使用したいと思うでしょう。これを行う方法は、UNIXおよびLinux SEの範囲外です(そして、アプリがどの言語で書かれているかさえ教えてくれませんでした)が、あなたが望むことを実行できるいくつかのライブラリがあります:

  • OpenSSLの libcrypto には、署名検証を処理するためのいくつかのプリミティブがあります。
  • [〜#〜] gpgme [〜#〜] は、GnuPGの作成者によって記述されたライブラリで、署名の検証など、多くのことが可能です。
  • GnuTLSは内部の 暗号化プリミティブ も公開していますが、推奨していません。

まだまだあると思いますが、これらは最も人気のあるソリューションです。 Cを使用していない場合に備えて、これらのライブラリのほとんどには他の言語のバインディングもあります。

0
Wouter Verhelst