メインコンテンツまでスキップ

8. CBC-DES Symmetric Encryption Protocol (CBC-DES 対称暗号化プロトコル)

8. CBC-DES Symmetric Encryption Protocol (CBC-DES 対称暗号化プロトコル)

このセクションでは, CBC-DES 対称暗号化プロトコルについて説明します。このプロトコルは, ユーザーベースセキュリティモデル用に定義された最初のプライバシープロトコルです。

このプロトコルは usmDESPrivProtocol によって識別されます。

時間の経過とともに, このプロトコルの代わりに, またはこのプロトコルに加えて, 他のプライバシープロトコルが定義される可能性があります。

8.1. Mechanisms (メカニズム)

CBC-DES 暗号化プロトコルは次のメカニズムを提供します:

Data Confidentiality Support (データ機密性サポート)

データ機密性をサポートするために, 暗号化アルゴリズムが必要です。送信される前にメッセージの適切な部分が暗号化されます。ユーザーベースセキュリティモデルは, scopedPDU が暗号化される必要があるメッセージの部分であることを指定します。

Secret Value and Timeliness (秘密値と適時性)

秘密値と適時性値の組み合わせが暗号化/復号化鍵と初期化ベクトルの作成に使用されます。秘密値は, 適切なユーザーに代わってメッセージを発信することを承認されたすべての SNMP エンジンによって共有されます。

8.1.1. Symmetric Encryption Protocol (対称暗号化プロトコル)

このメモで定義されている対称暗号化プロトコルは, データ機密性のサポートを提供します。SNMP メッセージの指定された部分が暗号化され, 受信者に送信されるメッセージの一部として含まれます。

2 つの組織が DES を定義する仕様を公開しています:

  • 米国国立標準技術研究所 (NIST) DES-NIST
  • 米国規格協会 (ANSI) DES-ANSI

各定義には対応する動作モード仕様があります (それぞれ DESO-NIST と DESO-ANSI)。

8.1.1.1. DES key and Initialization Vector (DES 鍵と初期化ベクトル)

DES Key (DES 鍵)

16 オクテットの秘密 (プライベートプライバシー鍵) の最初の 8 オクテットが DES 鍵として使用されます。DES は 56 ビットのみを使用するため, 各オクテットの最下位ビットは無視されます。

Initialization Vector (IV) (初期化ベクトル)

暗号化の初期化ベクトルは次の手順を使用して取得されます:

ステップ 1: Pre-IV (プレ IV)

16 オクテットの秘密 (プライベートプライバシー鍵) の最後の 8 オクテットが pre-IV として使用されます。

ステップ 2: Salt Generation (ソルト生成)

同じ鍵で暗号化された 2 つの異なるパケットの IV が同じにならないこと (つまり, IV が繰り返されないこと) を保証するために, パケットごとに一意の何かで pre-IV を"ソルト"する必要があります。8 オクテット文字列が"ソルト"として使用されます。

生成する SNMP エンジンの 32 ビット snmpEngineBoots と暗号化エンジンが維持するローカル 32 ビット整数の連結が"ソルト"に入力されます。32 ビット整数はブート時に任意の値に初期化されます。

ステップ 3: Salt Encoding (ソルトエンコーディング)

32 ビット snmpEngineBoots が"ソルト"の最初の 4 オクテット (最上位バイト優先) に変換されます。次に, 32 ビット整数が"ソルト"の最後の 4 オクテット (最上位バイト優先) に変換されます。

ステップ 4: IV Calculation (IV 計算)

結果として得られる"ソルト"が pre-IV と XOR されて IV が得られます。

ステップ 5: privParameters (プライバシーパラメータ)

8 オクテットの"ソルト"が OCTET STRING としてエンコードされて privParameters フィールドに入れられます。次に"ソルト"整数が変更されます。これを 1 ずつ増分し, 最大値に達したときにラップすることをお勧めします。

実装注記 (Implementation Note):

"ソルト"(したがって IV) の値がどのように変化するかは実装の問題ですが, 重複する IV の生成を避けるための措置が講じられている限りです。

"ソルト"は, 受信エンティティが正しい IV を計算してメッセージを復号化できるようにするために, privParameters フィールドに配置する必要があります。

8.1.1.2. Data Encryption (データ暗号化)

データ暗号化プロセスは次の手順に従います:

ステップ 1: Padding (パディング)

暗号化されるデータはオクテットのシーケンスとして扱われます。その長さは 8 の整数倍である必要があります - そうでない場合は, 必要に応じてデータの最後がパディングされます。実際のパッド値は無関係です。

ステップ 2: Cipher Block Chaining Mode (暗号ブロック連鎖モード)

データは暗号ブロック連鎖モードで暗号化されます。

ステップ 3: Block Processing (ブロック処理)

平文は 64 ビットブロックに分割されます。

各ブロックの平文は前のブロックの暗号文と XOR され, 結果が暗号化され, 暗号化の出力がそのブロックの暗号文になります。この手順は平文ブロックがなくなるまで繰り返されます。

ステップ 4: First Block (最初のブロック)

最初のブロックについては, 前のブロックの暗号文の代わりに初期化ベクトルが使用されます。

8.1.1.3. Data Decryption (データ復号化)

データ復号化プロセスは次の手順に従います:

ステップ 1: Length Verification (長さの検証)

復号化の前に, 暗号化されたデータの長さが検証されます。復号化される OCTET STRING の長さが 8 オクテットの整数倍でない場合, 復号化プロセスが停止し, 適切な例外が記録されます。復号化時には, パディングは無視されます。

ステップ 2: First Block Decryption (最初のブロックの復号化)

最初の暗号文ブロックが復号化され, 復号化出力が初期化ベクトルと XOR され, 結果が最初の平文ブロックになります。

ステップ 3: Subsequent Blocks (後続のブロック)

各後続ブロックについて, 暗号文ブロックが復号化され, 復号化出力が前の暗号文ブロックと XOR され, 結果が平文ブロックになります。

8.2. Elements of the DES Privacy Protocol (DES プライバシープロトコルの要素)

このセクションには, このメモのこのセクションで定義されているプライバシーモジュールを実現するために必要な定義が含まれています。

8.2.1. Users (ユーザー)

このプライバシープロトコルを使用したプライバシーは, 定義された userName のセットを利用します。特定の SNMP エンジンでメッセージを暗号化/復号化する必要があるユーザーに代わって, その SNMP エンジンはそのユーザーに関する知識を持っている必要があります。別の SNMP エンジンと通信したい SNMP エンジンは, そのエンジンに知られているユーザーに関する知識 (そのユーザーの適用可能な属性に関する知識を含む) も持っている必要があります。

ユーザーとその属性は次のように定義されます:

<userName> (ユーザー名)

ユーザーの名前を表す文字列。

<privKey> (プライバシー鍵)

メッセージを暗号化/復号化するときに使用されるユーザーの秘密鍵。CBC-DES の場合, 16 オクテット長でなければなりません

8.2.2. msgAuthoritativeEngineID (権威あるエンジン ID)

認証/暗号化されたメッセージに含まれる msgAuthoritativeEngineID 値は, その特定のメッセージの権威ある SNMP エンジンを指定します (SNMP アーキテクチャ文書 RFC 3411 の SnmpEngineID の定義を参照)。

ユーザーの (プライベート) プライバシー鍵は通常各権威ある SNMP エンジンで異なるため, snmpEngineID は暗号化/復号化プロセスに適切な鍵を選択するために使用されます。

8.2.3. SNMP Messages Using this Privacy Protocol (このプライバシープロトコルを使用する SNMP メッセージ)

このプライバシープロトコルを使用するメッセージは, msgSecurityParameters の一部として msgPrivacyParameters フィールドを運びます。

このプロトコルの場合, msgPrivacyParameters フィールドは, セクション 8.1.1.1 で説明されている"ソルト"を表すシリアル化された OCTET STRING です。

8.2.4. Services Provided by the DES Privacy Module (DES プライバシーモジュールによって提供されるサービス)

このセクションでは, ユーザーベースセキュリティモジュールが DES プライバシーモジュールをサービスのために呼び出すときに, DES プライバシーモジュールが期待する入力と生成する出力について説明します。

8.2.4.1. Services for Encrypting an Outgoing SNMP Message (送信 SNMP メッセージを暗号化するためのサービス)

DES プライバシープロトコルは, privKey の選択が呼び出し元によって行われ, 呼び出し元が使用する秘密鍵を渡すことを前提としています。

完了時, プライバシーモジュールは statusInformation を返し, 暗号化プロセスが成功した場合は encryptedPDU を返します。

抽象サービスプリミティブは次のとおりです:

statusInformation =              -- 成功または失敗
encryptData(
IN privKey -- 暗号化用の秘密鍵
IN dataToEncrypt -- 暗号化される scopedPDU
OUT encryptedData -- 暗号化された scopedPDU
OUT privParameters -- シリアル化された"ソルト"値
)

パラメータ (Parameters):

  • statusInformation: 暗号化プロセスが成功したかどうかの指示。成功しなかった場合は問題の指示。

  • privKey: 暗号化アルゴリズムが使用する秘密鍵。この鍵の長さは 16 オクテットでなければなりません。

  • dataToEncrypt: 暗号化される scopedPDU。

  • encryptedData: 出力時の暗号化された scopedPDU。

  • privParameters: この暗号化に使用された"ソルト"値, msgPrivacyParameters で送信されます。

8.2.4.2. Services for Decrypting an Incoming SNMP Message (受信 SNMP メッセージを復号化するためのサービス)

DES プライバシープロトコルは, privKey の選択が呼び出し元によって行われ, 呼び出し元が使用する秘密鍵を渡すことを前提としています。

完了時, プライバシーモジュールは statusInformation を返し, 復号化プロセスが成功した場合は decryptedPDU を返します。

抽象サービスプリミティブは次のとおりです:

statusInformation =              -- 成功または失敗
decryptData(
IN privKey -- 復号化用の秘密鍵
IN privParameters -- msgPrivacyParameters で受信されたもの
IN encryptedData -- 暗号化された scopedPDU
OUT decryptedData -- 復号化された scopedPDU
)

パラメータ (Parameters):

  • statusInformation: 復号化プロセスが成功したかどうかの指示。成功しなかった場合は問題の指示。

  • privKey: 復号化アルゴリズムが使用する秘密鍵。この鍵の長さは 16 オクテットでなければなりません。

  • privParameters: msgPrivacyParameters で受信された"ソルト"値。

  • encryptedData: 復号化される暗号化された scopedPDU。

  • decryptedData: 出力時の復号化された scopedPDU。

8.3. Elements of Procedure (手順の要素)

このセクションでは, CBC-DES プライバシープロトコルの手順について説明します。

8.3.1. Processing an Outgoing Message (送信メッセージの処理)

このセクションでは, SNMP エンジンがユーザーに代わってプライバシー (暗号化) を持つメッセージを生成するときに従う手順について説明します。

ステップ 1: プライバシー鍵を取得

ユーザーの 16 オクテット privKey を取得します。

ステップ 2: DES 鍵を抽出

最初の 8 オクテットを DES 鍵として抽出します。

ステップ 3: Pre-IV を取得

最後の 8 オクテットを pre-IV として抽出します。

ステップ 4: ソルトを生成

snmpEngineBoots とローカルカウンタを使用して 8 オクテットのソルト値を生成します。

ステップ 5: IV を計算

ソルトを pre-IV と XOR して初期化ベクトルを取得します。

ステップ 6: データをパディング

必要に応じて scopedPDU をパディングして 8 オクテットの倍数にします。

ステップ 7: 暗号化

DES 鍵と IV を使用して CBC-DES でパディングされた scopedPDU を暗号化します。

ステップ 8: privParameters を設定

ソルトを msgPrivacyParameters フィールドに配置します。

ステップ 9: 結果を返す

encryptedPDU と privParameters を返します。

8.3.2. Processing an Incoming Message (受信メッセージの処理)

このセクションでは, SNMP エンジンがプライバシー (暗号化) を持つメッセージを処理するときに従う手順について説明します。

ステップ 1: プライバシー鍵を取得

ユーザーの 16 オクテット privKey を取得します。

ステップ 2: DES 鍵を抽出

最初の 8 オクテットを DES 鍵として抽出します。

ステップ 3: Pre-IV を取得

最後の 8 オクテットを pre-IV として抽出します。

ステップ 4: ソルトを抽出

msgPrivacyParameters からソルトを抽出します。

ステップ 5: IV を計算

ソルトを pre-IV と XOR して初期化ベクトルを取得します。

ステップ 6: 長さを検証

暗号化されたデータの長さが 8 オクテットの倍数であることを確認します。そうでない場合は, エラーを返します。

ステップ 7: 復号化

DES 鍵と IV を使用して CBC-DES で encryptedPDU を復号化します。

ステップ 8: パディングを削除

復号化されたデータからパディングを削除します。

ステップ 9: 結果を返す

復号化された scopedPDU を返します。

Implementation Notes (実装に関する注意事項)

  1. 鍵長 (Key Length): privKey は CBC-DES の場合正確に 16 オクテットでなければなりません

  2. DES 鍵の使用 (DES Key Usage): 最初の 8 オクテットのみが DES 鍵として使用されます; 最後の 8 オクテットは IV 生成に使用されます

  3. ソルトの一意性 (Salt Uniqueness): ソルトは各メッセージに対して一意である必要があり, IV の一意性を確保します

  4. パディング (Padding): 実装はパディングを正しく処理し, 暗号化されたデータが常に 8 オクテットの倍数であることを保証する必要があります

  5. カウンタ管理 (Counter Management): ソルトカウンタはブート時に初期化され, 各メッセージごとに増分される必要があります

Security Considerations (セキュリティに関する考慮事項)

  • DES の非推奨 (DES Deprecation): DES は現代の基準では暗号学的に弱いと考えられています。56 ビットの有効鍵長はブルートフォース攻撃に脆弱です

  • 移行の推奨 (Migration Recommendation): 新しい実装は AES などのより強力な暗号化アルゴリズムの使用を検討する必要があります

  • IV の一意性 (IV Uniqueness): 同じ鍵に対して IV が繰り返されないことが重要です。実装は適切なソルト管理を保証する必要があります

  • 鍵管理 (Key Management): 16 オクテット privKey は秘密に保ち, 適切に管理する必要があります

  • CBC モード (CBC Mode): CBC モードは機密性を提供しますが, 整合性は提供しません。プライバシープロトコルは常に認証と一緒に使用する必要があります