Top PageSecurity TopCMS Top

封筒化データ(Enveloped-data)タイプ

一般的に使われている暗号データの形式。
暗号化されたコンテンツ及び、受取人の数だけ公開鍵で暗号化されたコンテンツ暗号化用(復号用)の鍵が含まれる。

封筒化データの種類
拡張子 ファイルの内容
.p7m PKCS#7(暗号メッセージ構文)形式の、Base64で符号化された電子署名。
"-----BEGIN PKCS7-----"と"-----END PKCS7-----"で囲まれる。

EnvelopedDataは以下のASN.1による記述で定義される。

[ASN.1] EnvelopedData (oid = 1.2.840.113549.1.7.3)
EnvelopedData ::= SEQUENCE {
  version CMSVersion,
  originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
  recipientInfos RecipientInfos,
  encryptedContentInfo EncryptedContentInfo,
  unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL }
OriginatorInfo ::= SEQUENCE {
  certs [0] IMPLICIT CertificateSet OPTIONAL,
  crls [1] IMPLICIT RevocationInfoChoices OPTIONAL }
RecipientInfos ::= SET SIZE (1..MAX) OF RecipientInfo
UnprotectedAttributes ::= SET SIZE (1..MAX) OF Attribute
EnvelopedDataについて
フィールド名 内容
version このEnvelopedDataデータのヴァージョンを示す。
4 : originatorInfoフィールドの中のcertsかcrlsで、otherタイプが選択される場合。
3 : originatorInfoフィールドのcertsに、v2attrCertタイプのデータがある場合。 or RecipientInfoにpwri構造体かori構造体がある場合。
0 : originatorInfoフィールドとunprotectedAttrsフィールドが無く、且つ全てのRecipientInfoフィールドのヴァージョンが0の場合。
2 : それ以外の場合
originatorInfo コンテンツ作成者の情報。
鍵管理アルゴリズムが要求される場合このフィールドが存在し、電子証明書群と証明書失効リスト群が含まれる。
certs … 電子証明書群(X.509 公開鍵証明書等)。
crls … 証明書失効リスト群。
recipientInfos コンテンツ受信者の情報群。少なくとも1個以上の受信者情報が無ければならない。
encryptedContentInfo 暗号化されたコンテンツとその情報。
unprotectedAttrs 暗号化されない属性の集まり。

暗号化コンテンツ (EncryptedContentInfo)

このフィールドには、暗号化されたコンテンツと、その情報が格納される。
ASN.1による記述は以下の通り。

EncryptedContentInfo ::= SEQUENCE {
  contentType ContentType,
  contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
  encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL }
EncryptedContent ::= OCTET STRING
EncryptedContentInfoについて
フィールド名 内容
contentType encryptedContentに格納される、暗号化されたコンテンツのタイプを示すoidが書かれる。
通常は、Dataタイプ(oid = 1.2.840.113549.1.7.1)
contentEncryptionAlgorithm 暗号のアルゴリズムとパラメータが格納される。
encryptedContent 暗号化されたコンテンツが格納される。
コンテンツが無い場合は、他の手段によって提供される。

受取人情報 (RecipientInfo)

鍵管理の手法によってそれぞれ異なったフォーマットとなる。
全てのケースにおいて、暗号化されたコンテンツ暗号化用の鍵は1つ以上の受取人情報に変換される。

RecipientInfo ::= CHOICE {
  ktri KeyTransRecipientInfo,
  kari [1] KeyAgreeRecipientInfo,
  kekri [2] KEKRecipientInfo,
  pwri [3] PasswordRecipientinfo,
  ori [4] OtherRecipientInfo }
EncryptedKey ::= OCTET STRING

鍵配送 (KeyTransRecipientInfo)

受取人情報に鍵配送(key transport)を用いる場合。

KeyTransRecipientInfo ::= SEQUENCE {
  version CMSVersion,  -- always set to 0 or 2
  rid RecipientIdentifier,
  keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
  encryptedKey EncryptedKey }
RecipientIdentifier ::= CHOICE {
  issuerAndSerialNumber IssuerAndSerialNumber,
  subjectKeyIdentifier [0] SubjectKeyIdentifier }
SubjectKeyIdentifier ::= OCTET STRING
KeyTransRecipientInfoについて
フィールド名 内容
version ridフィールドにおいて、
0 … issuerAndSerialNumber を選択する場合。
2 … subjectKeyIdentifier を選択する場合。
rid 発信者がコンテンツ暗号化用の鍵の暗号化に使った、受信者の公開鍵か公開鍵証明書を指定する。
コンテンツ暗号化用の鍵は、受信者の公開鍵によって暗号化される。
受信者の公開鍵証明書には鍵配送(key transport)用の公開鍵を含めなければならない。
したがって、拡張情報に鍵用途が含まれたversion 3のX.509公開鍵証明書には、 keyEnciphermentビットを主張しなければならない。
IssuerAndSerialNumberは、発行者の識別名と通し番号によって受信者の公開鍵証明書を確認する。
SubjectKeyIdentifierは、鍵の識別によって受信者の公開鍵証明書を確認する。
keyEncryptionAlgorithm コンテンツ暗号化用の鍵を暗号化するアルゴリズムとそのパラメータが格納される。
encryptedKey コンテンツ暗号化用の鍵を暗号化した結果が格納される。

鍵合意 (KeyAgreeRecipientInfo)

受取人情報に鍵合意(key agreement)を用いる場合。

KeyAgreeRecipientInfo ::= SEQUENCE {
  version CMSVersion,  -- always set to 3
  originator [0] EXPLICIT OriginatorIdentifierOrKey,
  ukm [1] EXPLICIT UserKeyingMaterial OPTIONAL,
  keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
  recipientEncryptedKeys RecipientEncryptedKeys }
OriginatorIdentifierOrKey ::= CHOICE {
  issuerAndSerialNumber IssuerAndSerialNumber,
  subjectKeyIdentifier [0] SubjectKeyIdentifier,
  originatorKey [1] OriginatorPublicKey }
OriginatorPublicKey ::= SEQUENCE {
  algorithm AlgorithmIdentifier,
  publicKey BIT STRING }
RecipientEncryptedKeys ::= SEQUENCE OF RecipientEncryptedKey
RecipientEncryptedKey ::= SEQUENCE {
  rid KeyAgreeRecipientIdentifier,
  encryptedKey EncryptedKey }
KeyAgreeRecipientIdentifier ::= CHOICE {
  issuerAndSerialNumber IssuerAndSerialNumber,
  rKeyId [0] IMPLICIT RecipientKeyIdentifier }
RecipientKeyIdentifier ::= SEQUENCE {
  subjectKeyIdentifier SubjectKeyIdentifier,
  date GeneralizedTime OPTIONAL,
  other OtherKeyAttribute OPTIONAL }
KeyAgreeRecipientInfoについて
フィールド名 内容
version 常に3とする。
originator 発信者の公開鍵を指定する。
発信者は、ペアの鍵を生成する為に受信者の公開鍵と、対応する秘密鍵を使用する。
コンテンツ暗号化用の鍵は、ペアの鍵で暗号化される。
ukm (オプション)
keyEncryptionAlgorithm コンテンツ暗号化用の鍵を暗号化するアルゴリズムとそのパラメータが格納される。
鍵暗号化用の鍵で、コンテンツ暗号化用の鍵を暗号化する。
recipientEncryptedKeys 1人以上の受取人の識別(rid)と、暗号化されたコンテンツ暗号化用の鍵(encryptedKey)が格納される。
KeyAgreeRecipientIdentifierは、受信者の公開鍵証明書と、それによって受信者の公開鍵が格納され、 ペアの鍵暗号化用の鍵を生成するために送信者に使われる。
受信者の公開鍵証明書には鍵合意(key agreement)用の公開鍵を含めなければならない。
したがって、拡張情報に鍵用途が含まれたversion 3のX.509公開鍵証明書には、 keyAgreementビットを主張しなければならない。
コンテンツ暗号化用の鍵は、ペアの鍵暗号化用の鍵によって暗号化される。

共通鍵暗号化鍵 (KEKRecipientInfo)

KEK …
Key-Encryption Key(鍵暗号化鍵)

前もって配布された鍵を用いる場合。
コンテンツを暗号化した鍵を暗号化するための鍵暗号化用の共通鍵が、前もって配布されている。

KEKRecipientInfo ::= SEQUENCE {
  version CMSVersion,  -- always set to 4
  kekid KEKIdentifier,
  keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
  encryptedKey EncryptedKey }
KEKIdentifier ::= SEQUENCE {
  keyIdentifier OCTET STRING,
  date GeneralizedTime OPTIONAL,
  other OtherKeyAttribute OPTIONAL }
KEKRecipientInfoについて
フィールド名 内容
version 常に4とする。
kekid 発信者と1人以上の受取人に前もって配布された鍵暗号用の鍵の識別を指定する。
keyEncryptionAlgorithm コンテンツ暗号化用の鍵を暗号化するアルゴリズムとそのパラメータが格納される。
鍵暗号化用の鍵で、コンテンツ暗号化用の鍵を暗号化する。
encryptedKey コンテンツ暗号化用の鍵を暗号化した結果が格納される。

鍵導出 (PasswordRecipientinfo)

パスワード、又は秘密値を用いる場合。
コンテンツを暗号化した鍵は、パスワードから生成されるか、外部(スマートカード等)に存在する。

PasswordRecipientInfo ::= SEQUENCE {
  version CMSVersion,   -- Always set to 0
  keyDerivationAlgorithm [0] KeyDerivationAlgorithmIdentifier OPTIONAL,
  keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
  encryptedKey EncryptedKey }
PasswordRecipientinfoについて
フィールド名 内容
version 常に0とする。
keyDerivationAlgorithm パスワード若しくは秘密値から鍵を生成させるアルゴリズムのoidが格納される。(オプション)
このフィールドが無い場合は、外部から鍵暗号用の鍵を提供しなければならない。
例えば、スマートカードの様なハードウェア暗号トークン等。
keyEncryptionAlgorithm コンテンツ暗号化用の鍵を暗号化するアルゴリズムとそのパラメータが格納される。
鍵暗号化用の鍵で、コンテンツ暗号化用の鍵を暗号化する。
encryptedKey コンテンツ暗号化用の鍵を暗号化した結果が格納される。

その他 (OtherRecipientInfo)

追加定義される鍵管理手法で使われる。

OtherRecipientInfo ::= SEQUENCE {
  oriType OBJECT IDENTIFIER,
  oriValue ANY DEFINED BY oriType }
OtherRecipientInfoについて
フィールド名 内容
oriType 鍵管理手法のoidが格納される。
oriValue 鍵管理手法に伴うデータが格納される。

コンテンツ暗号化のプロセス

コンテンツ暗号化用の鍵(要求された暗号化アルゴリズムのためのもの)は、ランダムに生成される。
暗号化されるコンテンツは以下に記述されるパディングを実施され、コンテンツ暗号化用の鍵を用いて暗号化される。

パディング

幾らかの暗号化アルゴリズムは、1つ以上の連なるブロック(K[Byte])から構成される。
この様な暗号化アルゴリズムを使う場合は、コンテンツはK - (L mod K) [Byte] のサイズで、以下の通りのパディングをしなければならない。

L …
暗号化するコンテンツの総サイズ(Byte)
K …
暗号のブロック長(Byte)

if (L mod K == K-1) … 01
if (L mod K == K-2) … 02 02
if (L mod K == 0) … K K K ... K

パディングデータは、必要の無いByte数の数値でその数だけパディングされているので、除去する事ができる。

例1(ブロック長 K = 8 / コンテンツ長 L = 20):
XX XX XX XX XX XX XX XX
XX XX XX XX XX XX XX XX
XX XX XX XX 04 04 04 04
例2(ブロック長 K = 8 / コンテンツ長 L = 16):
XX XX XX XX XX XX XX XX
XX XX XX XX XX XX XX XX
08 08 08 08 08 08 08 08

鍵暗号化のプロセス

コンテンツ暗号化用鍵CEK(前述のとおり、ランダムに生成される)の暗号化プロセスは、各々の鍵管理手法による。
暗号化されたコンテンツの受信者に、鍵管理手法を使用する事ができる。

鍵配送

この鍵管理手法では、対称鍵暗号アルゴリズム(RSA暗号等)を用いる。
まず、送信者は受信者の電子証明書(公開鍵証明書)を何らかの方法で入手しなければならない。
電子証明書に格納されている公開鍵(と暗号アルゴリズム)を用いて、コンテンツ用暗号鍵CEKを暗号化する。

受信者は、まず自分の秘密鍵でコンテンツ用暗号鍵CEKを複合する。
複合されたCEKで、コンテンツ本体を複合する。

鍵合意

to do : Diffie-Hellmanとか調べる。

共通鍵暗号化鍵

コンテンツ用暗号鍵CEKを暗号化するための暗号鍵は、前もって受信者に渡す。 受信者に渡しておいた鍵で、コンテンツ用暗号鍵CEKを暗号化する。

受信者は、送信者から前もって渡されていた鍵で、コンテンツ用暗号鍵CEKを複合する。 複合されたCEKで、コンテンツ本体を複合する。

鍵導出

この鍵管理手法では、コンテンツ用暗号鍵CEKを暗号化するための暗号鍵は、パスワードから導出、若しくは何らかの外部から提供する。
導出された暗号鍵にて、コンテンツ用暗号鍵CEKを暗号化する。

受信者は、同じく、コンテンツ用暗号鍵CEKを暗号化するための暗号鍵を、パスワードから導出、若しくは何らかの外部から入手する。
導出された暗号鍵で、コンテンツ用暗号鍵CEKを複合する。
複合されたCEKで、コンテンツ本体を複合する。