私のデバイスは完全な3DES(EDE)をサポートしていません。標準のDESを使用してエミュレートするにはどうすればよいですか?暗号化モードはCBCです。
3 に答える
互いにまったく関係のない 3 つの独立した DES キーを選択することから始めます。
DES をCBC モードではなく、ECB モードにする必要があります。また、各暗号化および復号化操作が 64 ビット ブロックに対してのみ実行され、それ以上またはそれ以下ではないことを確認する必要があります。パディングスキームなどは、実装に脆弱性を引き起こし、各キーに対するブルートフォースよりもブルートフォースによるブロックコンテンツの発見につながります。
最初のキーを使用して、平文を暗号化します。2 番目のキーを使用して、その値を復号化します。3 番目のキーを使用して、完全なブロックの値を暗号化します。次のようになります。
Encrypt(k3, Decrypt(k2, Encrypt(k1, plaintext)))
復号化は逆で、次のようになります。
Decrypt(k1, Encrypt(k2, Decrypt(k3, ciphertext)))
ブロックを 3DES で暗号化する場合は、CBC や CTR などの操作モードを適用し、必要に応じてパディングを適用する必要があります。
気をつけて。
ブロックモード暗号化
行うことは、サイズが 128 ビット (16 バイト) または 168 ビット (24 バイト) のキーをそれぞれ 2 つまたは 3 つの部分に分割することです。したがって、16 バイトのキー K の場合、2 つのキー Ka と Kb があり、24 バイトのキーの場合、Ka、Kb、Kc があります。DES ABC キーの有効強度は約 112 ビットで、DES ABA キーの有効強度は約 80 ビットです。
8 バイト (DES と 3DES の両方のブロック サイズ) の単一ブロックを暗号化するには、次の暗号化操作を実行します。 Cn = E(Ka, D(Kb, E(Kc, Mn))) ここで、Mn は n'平文メッセージの th ブロックと Cn は暗号文の n 番目のブロックです。Kc がない場合は、Ka を使用できます (DES ABC キーと DES ABA キー)。
これには、ECB モードでの単一ブロック暗号化と同じ単一ブロック DES 暗号化、または CBC と 00h の値の 8 バイトで構成される IV を使用した単一ブロック暗号化が必要です。
CBC
これでブロック暗号化がソートされました。次に、何らかの暗号化モードとパディング モードが必要です。ここでは CBC モードの暗号化について説明します。ECB はランダムでないデータの暗号化には使用しないでください。
CBC モードの暗号化では、ベクトルをプレーン テキストに XOR します。ベクトルは通常、最後の DESede 暗号化ブロックの出力です。先行する暗号文がないため、ランダム データを使用して最初のベクトルを自分で作成する必要があります。このベクトルは、初期化ベクトルまたは IV と呼ばれます。明確な図については、ウィキペディアを参照してください。
パディング
ブロック暗号モードでは、プレーン テキストの完全なブロックのみを暗号化できます。したがって、ある種のパディングスキームが必要になります。多くのパディング モードがありますが、ほとんどの場合、PKCS#5 パディングが使用されます。プレーン テキストを次のようにパディングする必要があります。値が 0Xh のバイトでパディングします。ここで、X は完全なブロックを作成するために必要なパディング バイト数です。X は 1 から 8 の間である必要があります。つまり、PKCS#5 パディングが常に使用されます。これにより、パディング バイトとプレーン テキストを区別することができます。
オンライン プロトコルでパディングを使用する場合は、パディング オラクル攻撃から保護する必要があります。この場合、別の鍵を使用して暗号文に HMAC を追加するなど、何らかの形式の整合性チェックを使用することを強くお勧めします。
3DESは、平文で 3 回使用される DES です。
ciphertext = E_K3(D_K2(E_K1(plaintext)))
plaintext = D_K1(E_K2(D_K3(ciphertext)))
E_Kn = Encryption with Key number n.
D_Kn = Decryption with Key number n.
したがって、DES だけで 3DES を簡単に「エミュレート」できます。
CBC モードでは、IV から始めて、次の平文ブロックと前の暗号文ブロックを XOR する必要があります。デバイスが CBC をサポートしていない場合、これも簡単に「エミュレート」されます。