web-dev-qa-db-ja.com

C#.Netの3DES鍵サイズ問題

以下のコードはc#.NETでうまく機能しています

byte[] key = Encoding.ASCII.GetByte("012345678901234567890123"); //24characters        
byte[] plainText = Encoding.ASCII.GetBytes("lasaa"); 
TripleDES des = TripleDES.Create();
des.Key = key;
des.Mode = CipherMode.CBC;
ICryptoTransform ic = des.CreateEncryptor();
byte[] enc = ic.TransformFinalBlock(plainText, 0, plainText.Length);
MessageBox.Show(UTF8Encoding.UTF8.GetString(enc));

上記に関する私の質問は...

  1. KeySizeを指定するにはどうすればよいですか? des.KeySize=128または192または256 それは与えます

指定されたキーはこのアルゴリズムに有効なサイズではありません

  1. さらに追加してキーの文字長を変更した場合(例:40文字)。エラーが出る

指定されたキーはこのアルゴリズムの有効なサイズではありません

なぜこれが起こるのか知りたいのですが?

19
Lasantha

3DESキーの長さは128ビットまたは192ビットです。 内部的にであることに注意してください。アルゴリズムは、128(それぞれ192)ビットのうち、112(それぞれ168)ビットのみを使用します。ただし、バイトにエンコードされて格納および交換される鍵自体は、長さが16バイトまたは24バイトでなければなりません。これら2つの長さの1つを持たないキーを設定しようとすると、エラーがトリガーされ、40バイトのキーを使用しようとするとエラーが発生します。

「鍵のサイズ」を設定しようとするべきではありません。鍵を設定するときにすでに決めています。 _TripleDES.Key_プロパティを設定すると、TripleDESクラスは24バイトのキーを指定したことを認識するため、KeySizeプロパティを192に設定します。

(3DES暗号化の出力はバイナリであり、文字列のUTF-8エンコーディングではありません。最後のUTF8Encoding.UTF8.GetString(enc)が抗議する可能性があります。)

26
Thomas Pornin

TripleDES のキーサイズは168ビットです。したがって、21バイトが必要になります。キーに文字列を使用したい場合は、最初にハッシュする必要があります。その場合は、任意の長さの文字を使用でき(より良い方)、ハッシュされた出力をキーサイズにトリミングできます。例えば。 SHA-256 を使用して32バイトを取得する場合は、そのうちの21バイトを使用します。

4
WhiteFang34

これが、この「トリム」を実現するために使用したコードです。

byte[] keyArray;
SHA512CryptoServiceProvider hash = new SHA512CryptoServiceProvider();
keyArray = hash.ComputeHash(UTF8Encoding.UTF8.GetBytes("someProperlySaltedKey"));
byte[] trimmedBytes = new byte[24];
Buffer.BlockCopy(keyArray, 0, trimmedBytes, 0, 24);
keyArray = trimmedBytes;
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
1
Krondorian

ここでの問題は、192ビットがC#の3DESでサポートされる最大のキーサイズであることです(そして私が想定している他の場所)。

http://msdn.Microsoft.com/en-us/library/system.security.cryptography.symmetricalgori ...

キーを16バイト/文字の値に設定してみましたか?

サポートされている他の唯一のサイズは128ビットのようです。もっと強力にしたい場合は、別のアルゴリズムAes/Rijndaelを使用する必要があります。

Wikipedia でTDESを検索すると、キーの最大サイズは168ビットと思われるため、Microsoftがどのように実装しているかはわかりません。

簡潔にするために、例から省略されたと思いますが、適切な量のソルトからキーをハッシュする必要があります。暗号名前空間には、このためのRNG/HSHアルゴリズムがいくつかあります。

0
Jodrell