web-dev-qa-db-ja.com

PHPでPGPを使用してファイルを暗号化しますか?

PGP暗号化を使用してCSVファイルを暗号化したい場合、PHPスクリプトを使用して生成し、そのファイルをメールでクライアントに送信します。クライアントは暗号化キーを提供します。暗号化ファイルに使用します。

PGPについてGoogleで調べたところ、かなり良いプライバシーであることがわかりました。また、OpenPGP http://www.openpgp.org/ およびGnuPG http://www.gnupg.org/ これら2種類のPGPとは何ですか?そして、どれを使うべきですか?

また、クライアントが提供するキーでPHP=のPGPを使用してファイルを暗号化する方法は?

私はこの用語を初めて聞いたことがありますが、誰でもこれを理解し、PHPでこれを実装するのを手伝ってください。

23
Prashant

質問1:PGPについて

  • [〜#〜] pgp [〜#〜](Pretty Good Privacy)はSymantec Corporationの製品および商標です(数年前に購入しました) 。
  • OpenPGPはPGPで使用される標準です。
  • GnuPG(Gnu Privacy Guard)は、PGPの無料でオープンソースの実装です。

したがって、あなたがしたいことは、OpenPGPキーに暗号化することです。クライアントがデータを復号化するために使用するOpenPGPの実装は重要ではありません。 PHPでは、一般にGnuPGが使用され、組み込みのインターフェイスがあります。

質問2:PHPでGnuPGを使用する

GnuPGインターフェイス を使用します。これは、PHP用にインストールできる拡張機能です。

最初に、鍵をインポートします。ここで、_$keydata_はASCII装甲公開鍵です:

_<?php
$gpg = new gnupg();
$info = $gpg -> import($keydata);
print_r($info);
?>
_

次に、このキーを使用してデータを暗号化します。今回はクライアントのキーの指紋を使用します。

_<?php
  $gpg = new gnupg();
  $gpg -> addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
  $enc = $gpg -> encrypt("just a test");
  echo $enc;
?>
_

ファイルを暗号化する場合は、それらを読み取り、encrypt()に渡します。少なくとも長いキーID(例:DEADBEEFDEADBEEF)を使用し、キーを参照するときは(例のように)より良いフィンガープリントを使用してください。および 短いキーID(DEADBEEF)は衝突攻撃に対して脆弱であるため、使用しないでください


より多くの 両方を行うための包括的な例 PHPマニュアルでユーザーが追加しました。

42
Jens Erat

PHP GnuPGの多くの例がネット上にあるので、答えをここに残しておきます。

基本的に、GnuPGコマンドラインツールの動作を反映しています。キーがまだgpgのキーリングにない場合は、キーをインポートする必要があり、暗号化/復号化に使用する受信者のキーを選択する必要があります。

gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt

あなたが私がしたことをして、受信者としてキーを渡した場合、それは動作しません!

このフィールドが「指紋」と呼ばれる GPGマニュアル または PHPドキュメンテーション のどちらにあるかは明らかではありません。新しくインポートしたキーのgpgのキーリングを確認します。

gpg --list-keys

これは次のようなものを出力します:

pub   rsa2048 2019-04-14 [SC] [expires: 2021-04-14]
      0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA
uid           [ultimate] Dean Or
sub   rsa2048 2019-04-14 [E] [expires: 2021-04-14]

これにより、UIDと2行目にすべてのキーに関連付けられた指紋が表示されます。 私が知る限り、UIDと指紋を受信者として使用できると言えます

したがって、PHP暗号化するコードは次のようになります。

// Encrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// Check key ring for recipient public key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) {
    $gpg->import('recipients-public-key.asc');
}
$gpg->addencryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
echo $gpg->encrypt('This is a test!');

受信者のコードは次のようになります。

// Decrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// Check key ring for recipient private key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) {
    $gpg->import('recipients-private-key.asc');
}
$gpg->adddecryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA', '');
echo $gpg->decrypt($encyptedMessage);

フィンガープリントは、受信者の公開鍵と秘密鍵の両方で同じであることに注意してください。

Adddecryptkeyがパスフレーズを取得しないという既知の問題もあります!パスフレーズを削除するか、GnuPGのバージョンを変更する必要があります。

0
Dean Or