2011-07-20 9 views
6

Wikipediaによれば、TripleDESは56ビット、112ビット、および168ビットのキー長をサポートしますが、System.Cryptography.TripleDESCryptoServiceProvider.LegalKeySizesは128ビットと192ビットのキー長のみを受け入れると言います。TripleDESキーサイズ - .NETとWikipedia

私が開発しているシステムは、相互運用性が必要です(私のコードで暗号化されたデータは、PHP、Java、Objective-Cで解読可能でなければなりません)。

私は誰を信じるべきですか?暗号化されたデータが移植可能であることを確認するにはどうすればよいですか?

答えて

13

Wikipediaで言うことはありませんTripleDESは56ビットのキーをサポートしています。 「キーイングオプション」では、「3倍長」キーと「2倍長」キーについて説明します。後者は、キーサイズを112ビットに縮小します。 元のDESの実効キーサイズは56ビットです。このようなキーは64ビット入力から構成されていますが、8ビットは未使用のままです。したがって、「3倍長」キーオプションは、3回64ビット(= 192ビット)から構成された3回の56ビット(= 168)で動作し、「倍長」オプションは2回の56ビットキー(= 112) 64ビット(= 128)の2倍から構成されます。

TripleDESCryptoServiceProviderは、最初に64ビットベースの入力から実際のキーを派生させる必要があるため、入力として128ビット(2倍長)または192ビット(3倍長)のいずれかしか使用せず、内部で168またはその入力からの112ビットの実際のキー。

これはTripleDESの標準的な手順なので、プラットフォーム間の移植性に問題はありません。

+0

無用の例を見ての3日間の有効キー長は、この答えは、私は.NETが192bitに128ビットキーとCCCrypt機能力あなたをサポートする方法実現に役立っていトリプルDES 192ビットで

。それは128ビットの最初の64ビットを最後にコピーするので、K3 = K1です。 iOS <-> C#.Netの相互運用性。とても簡単。 –

0

トリプルDESは128/192ビットの112/168ビットのみを使用します。 .NETは、整列の目的でさらに多くのビットを要求します(各56ビットのサブキーは64ビット境界に整列されます)。

56ビットDESが壊れていて、私は彼らが使用するのが難しくなったと思います。

0

DESのいくつかの(すべての)実装では、キーの文字あたり7ビット(ASCIIエンコーディング)しか使用しないと思います。私はDESの定義がキーの8ビット文字を許すかどうか、あるいは実際に各バイトの上位ビットを無視するかどうかはわかりません。私はそれが後者だと思う。

しかし、.NETキーサイズは、基本アルゴリズムがそのトップビットを無視しても、バイト数に基づいており、バイトあたり8ビットになります。それはおそらく主な相違です。

TripleDESは、3つの異なる56ビットDESキーを使用してDESを3回実行します。いくつかの実装では、3つの複製すべてに対して同じ56ビットDESキーを使用して単純なDESの暗号化を行うように、中間実行を逆転させる(暗号化復号化暗号化または「EDE」)。これは、両方ともハードウェアベースの暗号化を使用している古いシステムとの互換性のために行われました。 TripleDESCryptoServiceProviderがこの「EDE」アプローチまたは「EEE」アプローチを使用するかどうかはわかりません(または選択肢があります)。さらに、同じ56ビットのDESキーを1回目と3回目の実行に使用できます。これは、使用できる168ビットのキーの代わりに112ビットのキーを使用します。

認定されたTripleDESCryptoServiceProviderは、実際には3DESセキュリティではないため(56ビット(64ビット)キーは受け付けません)(代わりにDESCryptoServiceProviderを使用できますか?)一度に、168ビットEEE(またはEDE?)3DESは112ビット(128ビット)キーを使用するよりも大きなセキュリティを提供しないことが判明しました。しかし、短いキーが理論的にはより脆弱な極端な(一般的には利用できない)攻撃が存在する可能性があります。これは、EDE対EEEの質問にも適用されます。

あなたの互換性と他の言語に関する質問では、.NETの* CryptoServiceProviderクラスは、基礎となるWindows CRYPTOライブラリのラッパーAPIに過ぎません。他の言語もWindows CRYPTOライブラリを使用している場合は、互換性があります。それ以外の場合は、EDEまたはEEEを使用しているかどうかを確認し、すべてが同じものを使用していることを確認する必要があります(柔軟性がある場合とそうでない場合があります)。彼らはおそらくすべて同じバイトオーダーを使用していますが、もしあなたがまだ一致していないことが分かればそれはチェックする別のものかもしれません。ほとんどの場合、Windows上ではCRYPTOを使用しており、すべてのオプションを同じように設定できる限り、おそらく一致します。

+0

遅延:しかし、DESの定義は、(奇数)パリティのキーの各バイトの*ロー*ビットを予約しました。 1970年代に暗号化が専用の個別ハードウェアで行われ、ビットエラーが実際に発生しました。現在、ソフトウェアやファームウェアのほとんどすべてで、実装によってはパリティが無視され、一部ではそれでもコンパビリティについてチェックされています。私はドットNET(またはCAPI)が何をしているのかわかりません。 ASCIIはキー値に仮定されたり、必要とされるべきではなく、その定義とはまったく関係がありません。 ... –

+0

...また、EDEとEEEの両方が、DESの「強化」が必要であることは明らかであったが、EDEだけが標準化されていた1990年代には、今日の実装を見つけるのは非常に驚きだったEEE。 –

+0

@ dave_thompson_085 EDEによる標準化の明確化のために感謝します。パリティビットでは、ソフトウェア実装(可能なハードウェア実装への変換)が、下位7ビットに多くのエントロピーがあるときに、各提供バイトの上位7ビットを取った場合(暗号化パスワードが直接提供された場合、 - おそらくばかげて)。私はそれが各バイトの下位7ビットを保持し、それらを計算されたパリティとともに3DES実装にシフトすることが最も賢明だと思います。もちろん、それは賢明ではなく、エントロピーを失うかもしれません。 –

0

デスは64ビットの倍数を使用しますが、8ビットをスローして64ビットの有効なキー長を残します。
トリプルデールはダブルまたはトリプルキーの長さを使用できます。
しかし、同じキーを使用してdesを繰り返すと、偶数回実行しているメッセージを復号化できるため、キーがパターンを共有していると部分的に復号化することができます。

このため、desは常に奇数回実行されます。

これは、64ビット部分が繰り返されるキーを決して選択しないようにする理由です。あなたは、このように112ビット