web-dev-qa-db-ja.com

MS-CHAPv2からのMPPE送信および受信キーの派生

MS-CHAPv2チャレンジマテリアルからMS-MPPE-Send-keyとMS-MPPE-Recv-keyを取得しようとしています。 RFC 254878 および 79 に従って、GetNewKeyFromSHA()を取得するステップに進むことができます。長さは16バイトです。 。

79 の例のように、キーを使用してデータを暗号化できます。問題は、RFC 2548 で使用されているセッションキーを取得して、そこからMS-MPPE-Send-keyおよびMS-MPPE-Recv-keyフィールドを取得するにはどうすればよいかわからないということです。

Freeradiusの例があります。RFC 2548 に記載されている文字列の作成前に、セッションキーが16バイト長から32バイト長に変換されます。

GetNewKeyFromSHA()の後にセッションキーをRC4で暗号化しようとしましたが、機能しません。誰かがこの中間ステップについて少し詳しく説明できれば、それは素晴らしいことです。

編集1

2548 で暗号化を2回試みましたが、まだ結果はありません。現在、freeRADIUSソースコードを掘り下げていますが、MS-CHAPv2マテリアルからマスターキーを取得した後、簡単に追跡することはできません。何か案は?

編集2

Freeradiusを見ると、最初にMS-CHAv2マテリアルからキーを導出しているようですが、送信を暗号化する代わりに、マスターシークレットとTLSハンドシェイクからの乱数を使用して、32バイトの送受信キーを生成します。 。これはRFC 2716 のとおりであり、RFC 2548 として暗号化して、最後に送信します。

RFC 79 のように、MS-CHAPv2マテリアルから派生したマスターキーを使用することは可能ですか?またはこれを行う唯一の方法は、freeradiusと同じですか?

13
Jaime

あなたの質問がわからない、それはこれらの値がどのように暗号化されるのですか? RFC-2548セクション2.4.2 で説明されています。

私がこれを考える理由は、あなたの質問であなたが述べているからです:

Freeradiusの例があり、RFC 2548で述べられている文字列の構築前に、セッションキーが16バイト長から32バイト長に変換されます。

したがって、16バイトのキーからRADIUS属性で使用される32バイトの値にどのように移動するのでしょうか。

基本的に、32バイトのキーは、16バイトのキーの連結された2つのMD5ハッシュです。このため、値は16の倍数である必要があります。 16ではなく32があるのは、シングルバイト値16(キー長の場合)をキー値の前に付加して、長さを17にし、それを2番目の16バイトウィンドウにプッシュするためです。 。残りの15バイトには0を埋め込む必要があります。

とにかく、RADIUS shared-secret、16バイトRequest Authenticatorを使用して、現在の17バイトのKey-Valueを暗号化しています。オリジナルRADIUSリクエスト、およびランダムな2バイトのソルト値。

ランダムなソルト値は文字通り何でもかまいません。あなたが指摘したように、freeradiusはこれをTLS関数から導出しますが、これはTLSを介して実際にトンネリングしている場合にのみ適しています。空気から何かを引き出すことができます。

次に、32バイトの暗号化された値に2バイトのソルト値を付加して、34バイトの値を作成すれば完了です。

     Construct a plaintext version of the String field by concate-
     nating the Key-Length and Key sub-fields.  If necessary, pad
     the resulting string until its length (in octets) is an even
     multiple of 16.  It is recommended that zero octets (0x00) be
     used for padding.  Call this plaintext P.

     Call the shared secret S, the pseudo-random 128-bit Request
     Authenticator (from the corresponding Access-Request packet) R,
     and the contents of the Salt field A.  Break P into 16 octet
     chunks p(1), p(2)...p(i), where i = len(P)/16.  Call the
     ciphertext blocks c(1), c(2)...c(i) and the final ciphertext C.
     Intermediate values b(1), b(2)...c(i) are required.  Encryption
     is performed in the following manner ('+' indicates
     concatenation):

  b(1) = MD5(S + R + A)    c(1) = p(1) xor b(1)   C = c(1)
  b(2) = MD5(S + c(1))     c(2) = p(2) xor b(2)   C = C + c(2)
              .                      .
              .                      .
              .                      .
  b(i) = MD5(S + c(i-1))   c(i) = p(i) xor b(i)   C = C + c(i)

  The   resulting   encrypted   String   field    will    contain
  c(1)+c(2)+...+c(i).
1
robert