web-dev-qa-db-ja.com

署名に鍵公開鍵がないデジタル署名を検証する

メールを受信すると、次のようなメッセージが表示されることがあります。

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1

I found an integer overflow in PHP, in the conversation of dates to "Julian Day Count" function.

The commit, with a PoC can be found here: https://github.com/MegaManSec/php-src/commit/a538d2f5605798422f2746636 ecdc300f8ebcaa1
Use CVE-2015-1353.

CVE assignment team, MITRE CVE Numbering Authority M/S M300 202 Burlington
Road, Bedford, MA 01730 USA [ PGP key available through
http://cve.mitre.org/cve/request_id.html ]

-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.14 (SunOS)

iQEcBAEBAgAGBQJUw/LpAAoJEKllVAevmvmsiYoH/Ag+n/8x+blfJyccUhjt39bp
nRxsuZw2MIx7COJcoufIxeycu2YGnm1O9RxZBA9lKmVYjb0wjMi9yHogcWkT8UOo 
i93ARMw7V6UFp1nV+2Kv5BgVh2EcwEBXyDkKkcaN2l68Dm3nRoApMB4i4m7G67BC 
K2T1L4eq1orQCNaR7n4hup2155pHZbLqZQRMAYn5EGQPr/+zPjgq+PQKes631US5 
SXrnthRKOAfZk9QVIlxf5t1JfVvC3Cta0HgETTaXJ8TbqEAA5AXw8hl+RmhWgFnI 
Cto73LM+iiA1tyxDXdXnfdRqV/uxmqK+FCgO6asyCuT7EYOpBZ74Wmq1z+RVJRc=
=VLR4 
-----END PGP SIGNATURE-----

私の理解によると、デジタル署名は次のように機能します。

  1. メッセージのコンテンツはハッシュされ、コンテンツ全体の固定長出力が提供されます。
  2. 生成されたハッシュは、送信者の秘密鍵で暗号化されます(PS:公開鍵は、異なるコンテキストを暗号化するために使用されたと思いますか?)
  3. 上記のプロセスは、元のメッセージとともに送信されるデジタル署名を作成します
  4. 受信者は公開鍵を使用して暗号文を復号化し、ハッシュを返し、メッセージを自分でハッシュして同じかどうかを確認します

私が理解できない問題は公開鍵の部分です。上記のMitreの例では、署名を復号化するために送信される公開鍵がありません。では、この署名を検証するにはどうすればよいですか? 「PGP key available throught」というリンクが提供されていることがわかりますが、このリンクにはキーIDが含まれています。このキーIDとは何ですか?それは公開キーを見つけるために必要なものですか?

6
W Khan

CVEのPGP/KEYを見つける

この記事では、GPGキー、特にCVEサイトの公開キーを検索する方法について説明します。そこにインポートする方法の説明があり、以下に基本的なインポート手順を示します。

一般的なGPG/PGP

PGP/GPGでは、ユーザーが鍵を生成すると、それに関連付けられた鍵IDもあります。あなたが提供したリンクで、fingerprintの最後の4バイトもであることがわかりますキーID

通常、ユーザーは自分の公開鍵を鍵サーバーにアップロードします。 key IDは、キーサーバーがデータベース内のキーを検索するために使用するものです。他のユーザーは、暗号化または検証しようとしているデータに関連付けられているキーIDをキーサーバーで検索できます。 GPGはキーチェーンを使用して、そのすべての操作を実行します。 Linuxボックスでは、GPGをインストールできます。

Debian:

Sudo apt-get install pgpgpg

次に、キーサーバーから特定のkey IDを使用してキーチェーンにキーをインポートできます。

gpg --recv-keys 0x<key_id> --keyserver 'http://key-server.org'

または、キーファイルがある場合:

gpg --import <keyfile>

ドキュメントに署名する方法はいくつかあります。分離された署名ファイルを作成する方法の1つ。この場合、次のことができます。

gpg --verify file-1.2.3.tar.sig file-1.2.3.tar

ただし、あなたのケースでは、同じファイルにメッセージと署名の両方があります。あなたは両方を持っているのでわかる-----BEGIN PGP SIGNED MESSAGE-----および-----BEGIN PGP SIGNATURE-----メッセージ内。この場合、単に 以下を実行 できます。

gpg --output your-file.txt --decrypt my-file.gpg


これらのverifyコマンドのそれぞれについて、GPGはメッセージの署名に使用されたキーをキーチェーンで調べようとします。見つからない場合は、エラーメッセージが表示されます。

あなたはこれを電子メールで見ると述べました。 Thunderbirdを使用している場合は、キーサーバーの設定、GPG/PGPキーのインポート、メール署名の暗号化/復号化/検証を可能にする Enigmail という拡張機能があります。


公開鍵と秘密鍵がどのように関連しているかについての質問に答えるには、 Thomas Pornin's Answer here を一読します。

3
RoraΖ

私はpgpやgpgにはあまり詳しくありませんが、これが単純なrsaでどのように機能するかを説明できます。

秘密鍵で暗号化したものに署名したい場合、このメッセージを受け取った人は誰でもあなたの公開鍵でそれを解読できるため、秘密鍵を持っている人がこのメッセージを送信したことを知っています(できれば、あなただけが秘密鍵を持っています)。

両方にrsa鍵がある場合は、秘密鍵で暗号化してから、メッセージを送信する相手の公開鍵で暗号化できます。その後、受信者はそれに応じてメッセージを復号化し、1人だけが開くことができ、1人だけが送信できたというメッセージがあります。

私がpgpとgpgを理解している限り、彼らは秘密鍵でメッセージをハッシュし、RSAでこの鍵を暗号化します。

鍵に関する問題:公開鍵サーバーがあります(例:MIT: https://pgp.mit.edu/

1
yamm