0

それで、DESの暗号ライブラリであるpyDespyDes.des(key, [mode], [IV], [pad], [padmode])には、このようなAPIがあります。使用法は次のようになりますk = des("DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)-暗号化のCBCまたはECBモードを使用できます.ただし、教授からの割り当てとして、pyDesライブラリを使用して暗号化するように指示されましたが、CBCとカウンターモードを手動で使用します.

私はCBCモードをうまくやることができましたが、残念ながら私はカウンターモードで立ち往生しています。指定された API をdes(key, CBC, IV ...)使用すると、CBC または ECB モードの操作を使用する場合にのみ IV を使用できます。「foo」が私のIVであるようなものを使用することはできませんdes("hello", mode = None, "foo",....)(カウンターモードの操作を実装することになっており、ivはすべての反復でランダムです)したがって、私の質問は誰かがこの問題に直面し、克服しようとしたことですそれ。

4

1 に答える 1

1

いくつかのモードを実装するために分離する必要がある主な操作は、操作モードまたはパディングのない実際のブロック暗号です。pyDes はブロック暗号への直接アクセスを提供していないようですが、ECB モードで簡単にエミュレートできます。ECB は、すべての入力ブロックに対して同じ方法でブロック暗号を単純に実行したものです。

アイデアは、カウンター入力ストリームを作成し、入力ストリームで ECB を実行してキー ストリームを取得し、平文のすべてのバイトをキー ストリーム内の対応するバイトと XOR することです。

CTR モードの手順:

  1. 開始カウンターである0~ (DES ブロック サイズ)の範囲でランダムなノンス (IV) を生成します。1<<64

    import random
    r = random.SystemRandom()
    nonce = r.randrange(0, 1<<64)
    
  2. 平文の各ブロックのカウンターをバイトに変換し、カウンターstruct.pack('>Q', counter)を1つ増やします

  3. 少なくとも平文と同じバイト数がカウンター ストリームに含まれるまで繰り返します。
  4. ECB モードと利用可能なパディングでカウンター入力ストリームを暗号化する
  5. キー ストリームと平文の XOR を実行し、残りのキー ストリームを破棄します (存在する場合)。

CTR モードはストリーム暗号であるため、ノンスを外部から提供する必要があるという違いだけで、まったく同じ操作を復号化に使用できます。ノンスを暗号文の先頭に追加して、復号化に使用できるようにすることができます。シークレットである必要はありませんが、同じキーを使用する場合は一意である必要があります。

DES と 3DES のブロック サイズでは、同じキーの下で CTR を使用して多くの暗号文または長い暗号文を暗号化することはできないことに注意してください。その場合は、AES のようなブロック サイズの大きいブロック暗号に変更する必要があります。

于 2015-11-10T09:38:05.920 に答える