都立工業高等専門学校(現、東京都立産業技術高等専門学校)を卒業、
機械工学が専攻だった癖に論理回路やオーディオ関係の技術者らしい。
趣味として、音楽関係のフリーソフト開発や、DTM・チップチューン活動をしたり、
オーケストラや吹奏楽団でオーボエを吹いてる人。
上のアドレスの『@』と『nifty』の間に『spa.』を追加して下さい。
画像で記載されているアドレスでも届きますが、スパム防止のフィルターを多数導入しています。
本ホームページはリンクフリーです。
リンクは、トップページ
"http://shaw.la.coocan.jp/"
にお願いいたします。
Top Page\ Security Top\ CMS Top\
一般的に使われている暗号データの形式。
暗号化されたコンテンツ及び、受取人の数だけ公開鍵で暗号化されたコンテンツ暗号化用(復号用)の鍵が含まれる。
拡張子 | ファイルの内容 |
---|---|
.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
フィールド名 | 内容 |
---|---|
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 | 暗号化されない属性の集まり。 |
このフィールドには、暗号化されたコンテンツと、その情報が格納される。
ASN.1による記述は以下の通り。
EncryptedContentInfo ::= SEQUENCE { contentType ContentType, contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier, encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL }
EncryptedContent ::= OCTET STRING
フィールド名 | 内容 |
---|---|
contentType | encryptedContentに格納される、暗号化されたコンテンツのタイプを示すoidが書かれる。 通常は、Dataタイプ(oid = 1.2.840.113549.1.7.1) |
contentEncryptionAlgorithm | 暗号のアルゴリズムとパラメータが格納される。 |
encryptedContent | 暗号化されたコンテンツが格納される。 コンテンツが無い場合は、他の手段によって提供される。 |
鍵管理の手法によってそれぞれ異なったフォーマットとなる。
全てのケースにおいて、暗号化されたコンテンツ暗号化用の鍵は1つ以上の受取人情報に変換される。
RecipientInfo ::= CHOICE { ktri KeyTransRecipientInfo, kari [1] KeyAgreeRecipientInfo, kekri [2] KEKRecipientInfo, pwri [3] PasswordRecipientinfo, ori [4] OtherRecipientInfo }
EncryptedKey ::= OCTET STRING
受取人情報に鍵配送(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
フィールド名 | 内容 |
---|---|
version | ridフィールドにおいて、 0 … issuerAndSerialNumber を選択する場合。 2 … subjectKeyIdentifier を選択する場合。 |
rid | 発信者がコンテンツ暗号化用の鍵の暗号化に使った、受信者の公開鍵か公開鍵証明書を指定する。 コンテンツ暗号化用の鍵は、受信者の公開鍵によって暗号化される。 受信者の公開鍵証明書には鍵配送(key transport)用の公開鍵を含めなければならない。 したがって、拡張情報に鍵用途が含まれたversion 3のX.509公開鍵証明書には、 keyEnciphermentビットを主張しなければならない。 IssuerAndSerialNumberは、発行者の識別名と通し番号によって受信者の公開鍵証明書を確認する。 SubjectKeyIdentifierは、鍵の識別によって受信者の公開鍵証明書を確認する。 |
keyEncryptionAlgorithm | コンテンツ暗号化用の鍵を暗号化するアルゴリズムとそのパラメータが格納される。 |
encryptedKey | コンテンツ暗号化用の鍵を暗号化した結果が格納される。 |
受取人情報に鍵合意(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 }
フィールド名 | 内容 |
---|---|
version | 常に3とする。 |
originator | 発信者の公開鍵を指定する。 発信者は、ペアの鍵を生成する為に受信者の公開鍵と、対応する秘密鍵を使用する。 コンテンツ暗号化用の鍵は、ペアの鍵で暗号化される。 |
ukm | (オプション) |
keyEncryptionAlgorithm | コンテンツ暗号化用の鍵を暗号化するアルゴリズムとそのパラメータが格納される。 鍵暗号化用の鍵で、コンテンツ暗号化用の鍵を暗号化する。 |
recipientEncryptedKeys | 1人以上の受取人の識別(rid)と、暗号化されたコンテンツ暗号化用の鍵(encryptedKey)が格納される。 KeyAgreeRecipientIdentifierは、受信者の公開鍵証明書と、それによって受信者の公開鍵が格納され、 ペアの鍵暗号化用の鍵を生成するために送信者に使われる。 受信者の公開鍵証明書には鍵合意(key agreement)用の公開鍵を含めなければならない。 したがって、拡張情報に鍵用途が含まれたversion 3のX.509公開鍵証明書には、 keyAgreementビットを主張しなければならない。 コンテンツ暗号化用の鍵は、ペアの鍵暗号化用の鍵によって暗号化される。 |
前もって配布された鍵を用いる場合。
コンテンツを暗号化した鍵を暗号化するための鍵暗号化用の共通鍵が、前もって配布されている。
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 }
フィールド名 | 内容 |
---|---|
version | 常に4とする。 |
kekid | 発信者と1人以上の受取人に前もって配布された鍵暗号用の鍵の識別を指定する。 |
keyEncryptionAlgorithm | コンテンツ暗号化用の鍵を暗号化するアルゴリズムとそのパラメータが格納される。 鍵暗号化用の鍵で、コンテンツ暗号化用の鍵を暗号化する。 |
encryptedKey | コンテンツ暗号化用の鍵を暗号化した結果が格納される。 |
パスワード、又は秘密値を用いる場合。
コンテンツを暗号化した鍵は、パスワードから生成されるか、外部(スマートカード等)に存在する。
PasswordRecipientInfo ::= SEQUENCE { version CMSVersion, -- Always set to 0 keyDerivationAlgorithm [0] KeyDerivationAlgorithmIdentifier OPTIONAL, keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier, encryptedKey EncryptedKey }
フィールド名 | 内容 |
---|---|
version | 常に0とする。 |
keyDerivationAlgorithm | パスワード若しくは秘密値から鍵を生成させるアルゴリズムのoidが格納される。(オプション) このフィールドが無い場合は、外部から鍵暗号用の鍵を提供しなければならない。 例えば、スマートカードの様なハードウェア暗号トークン等。 |
keyEncryptionAlgorithm | コンテンツ暗号化用の鍵を暗号化するアルゴリズムとそのパラメータが格納される。 鍵暗号化用の鍵で、コンテンツ暗号化用の鍵を暗号化する。 |
encryptedKey | コンテンツ暗号化用の鍵を暗号化した結果が格納される。 |
追加定義される鍵管理手法で使われる。
OtherRecipientInfo ::= SEQUENCE { oriType OBJECT IDENTIFIER, oriValue ANY DEFINED BY oriType }
フィールド名 | 内容 |
---|---|
oriType | 鍵管理手法のoidが格納される。 |
oriValue | 鍵管理手法に伴うデータが格納される。 |
コンテンツ暗号化用の鍵(要求された暗号化アルゴリズムのためのもの)は、ランダムに生成される。
暗号化されるコンテンツは以下に記述されるパディングを実施され、コンテンツ暗号化用の鍵を用いて暗号化される。
幾らかの暗号化アルゴリズムは、1つ以上の連なるブロック(K[Byte])から構成される。
この様な暗号化アルゴリズムを使う場合は、コンテンツはK - (L mod 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で、コンテンツ本体を複合する。