Hatena::Groupprogram

lnzntのプログラミング日記 このページをアンテナに追加 RSSフィード

2012年05月27日(日)

PGP - MIME Security with OpenPGP

| 11:07 | PGP  - MIME Security with OpenPGP - lnzntのプログラミング日記 を含むブックマーク はてなブックマーク - PGP  - MIME Security with OpenPGP - lnzntのプログラミング日記 PGP  - MIME Security with OpenPGP - lnzntのプログラミング日記 のブックマークコメント

PGP*1 の標準仕様 OpenPGP は RFC として公開されています。

番号タイトルステータス
RFC6091Using OpenPGP Keys for Transport Layer Security (TLS) AuthenticationInformational
RFC5581The Camellia Cipher in OpenPGPInformational
RFC5081Using OpenPGP Keys for Transport Layer Security (TLS) Authenticationobsoleted by RFC6091
RFC4880OpenPGP Message FormatProposed Standard/updated by RFC5581
RFC3156MIME Security with OpenPGPProposed Standard
RFC2726PGP Authentication for RIPE Database UpdatesProposed Standard
RFC2440OpenPGP Message Formatobsoleted by RFC4880
RFC2015MIME Security with Pretty Good Privacy (PGP)Proposed Standard/updated by RFC3156
RFC1991PGP Message Exchange Formatsobsoleted by RFC4880

ここでは、MIMEタイプを使ったOpenPGPメッセージの運用について書かれた「MIME Security with OpenPGP (RFC3156)」の要点を整理します。

MIME Security with OpenPGP (RFC3156)

以下の三様のメッセージ形態について述べられています。

  • 暗号化されたメッセージ
  • 署名されたメッセージ
  • 暗号化と署名の両方がされたメッセージ

暗号化されたメッセージ

RFC で示された例

      From: Michael Elkins <elkins@aero.org>
      To: Michael Elkins <elkins@aero.org>
      Mime-Version: 1.0
      Content-Type: multipart/encrypted; boundary=foo;
         protocol="application/pgp-encrypted"

      --foo
      Content-Type: application/pgp-encrypted

      Version: 1

      --foo
      Content-Type: application/octet-stream

      -----BEGIN PGP MESSAGE-----
      Version: 2.6.2

      hIwDY32hYGCE8MkBA/wOu7d45aUxF4Q0RKJprD3v5Z9K1YcRJ2fve87lMlDlx4Oj
      eW4GDdBfLbJE7VUpp13N19GL8e/AqbyyjHH4aS0YoTk10QQ9nnRvjY8nZL3MPXSZ
      g9VGQxFeGqzykzmykU6A26MSMexR4ApeeON6xzZWfo+0yOqAq6lb46wsvldZ96YA
      AABH78hyX7YX4uT1tNCWEIIBoqqvCeIMpp7UQ2IzBrXg6GtukS8NxbukLeamqVW3
      1yt21DYOjuLzcMNe/JNsD9vDVCvOOG3OCi8=
      =zzaA
      -----END PGP MESSAGE-----

      --foo--
  • Content-type は「multipart/encrypted」であること
    • protocol パラメタは「"application/pgp-encrypted"」であること
  • 以下の 2 つのボディを持つ
    • 最初のボディ
      • Content-type は「application/pgp-encrypted」であること
      • この仕様に準拠したメッセージは「Version: 1」を持つ
    • 2番目のボディ
      • Content-type は「application/octet-stream」
      • 内容は OpenPGP 暗号化メッセージ

署名されたメッセージ

RFC で示された例

         From: Michael Elkins <elkins@aero.org>
         To: Michael Elkins <elkins@aero.org>
         Mime-Version: 1.0
         Content-Type: multipart/signed; boundary=bar; micalg=pgp-md5;
           protocol="application/pgp-signature"

         --bar
      & Content-Type: text/plain; charset=iso-8859-1
      & Content-Transfer-Encoding: quoted-printable
      &
      & =A1Hola!
      &
      & Did you know that talking to yourself is a sign of senility?
      &
      & It's generally a good idea to encode lines that begin with
      & From=20because some mail transport agents will insert a greater-
      & than (>) sign, thus invalidating the signature.
      &
      & Also, in some cases it might be desirable to encode any   =20
      & trailing whitespace that occurs on lines in order to ensure  =20
      & that the message signature is not invalidated when passing =20
      & a gateway that modifies such whitespace (like BITNET). =20
      &
      & me

      --bar

      Content-Type: application/pgp-signature

      -----BEGIN PGP MESSAGE-----
      Version: 2.6.2

      iQCVAwUBMJrRF2N9oWBghPDJAQE9UQQAtl7LuRVndBjrk4EqYBIb3h5QXIX/LC//
      jJV5bNvkZIGPIcEmI5iFd9boEgvpirHtIREEqLQRkYNoBActFBZmh9GC3C041WGq
      uMbrbxc+nIs1TIKlA08rVi9ig/2Yh7LFrK5Ein57U/W72vgSxLhe/zhdfolT9Brn
      HOxEa44b+EI=
      =ndaj
      -----END PGP MESSAGE-----

      --bar--

(本文中の行頭「&」は署名対象であることを示した印)

  • Content-type は「multipart/signed」であること
    • protocol パラメタは「"application/pgp-signature"」であること
    • micalg パラメタは「pgp-ハッシュ名(MIC)」であること
  • 以下の 2 つのボディを持つ
    • 最初のボディ
      • 署名対象データ (具体的に対象となる範囲は上例を参照)
    • 2番目のボディ
      • Content-type は「application/pgp-signature」
      • 内容は OpenPGP 署名メッセージ

暗号化と署名の両方がされたメッセージ

2 つの方法が示されています。

RFC 1847 カプセル化

RFC で示された例

        Content-Type: multipart/encrypted;
            protocol="application/pgp-encrypted"; boundary=foo

         --foo
         Content-Type: application/pgp-encrypted

         Version: 1

         --foo
         Content-Type: application/octet-stream

         -----BEGIN PGP MESSAGE-----
      & Content-Type: multipart/signed; micalg=pgp-md5
      &     protocol="application/pgp-signature"; boundary=bar
      &
      & --bar
      & Content-Type: text/plain; charset=us-ascii
      &
      & This message was first signed, and then encrypted.
      &
      & --bar
      & Content-Type: application/pgp-signature
      &
      & -----BEGIN PGP MESSAGE-----
      & Version: 2.6.2
      &
      & iQCVAwUBMJrRF2N9oWBghPDJAQE9UQQAtl7LuRVndBjrk4EqYBIb3h5QXIX/LC//
      & jJV5bNvkZIGPIcEmI5iFd9boEgvpirHtIREEqLQRkYNoBActFBZmh9GC3C041WGq
      & uMbrbxc+nIs1TIKlA08rVi9ig/2Yh7LFrK5Ein57U/W72vgSxLhe/zhdfolT9Brn
      & HOxEa44b+EI=
      & =ndaj
      & -----END PGP MESSAGE-----
      &
      & --bar--
        -----END PGP MESSAGE-----

        --foo--

(本文中の行頭「&」は実際には暗号化されていることを示した印)

  1. メッセージを「署名されたメッセージ」の方式で署名する
  2. 署名されたメッセージを「暗号化されたメッセージ」の方式で暗号化する
組み合わせ方法

暗号化」と「署名」が組み合わされた OpenPGP メッセージを「暗号化されたメッセージ」の方式で暗号化します。

公開鍵を添付する場合

以下の MIMEタイプを使います。

   Content-Type: application/pgp-keys
   Required parameters: none
   Optional parameters: none