以下のコードは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));
上記に関する私の質問は...
des.KeySize=
128
または192
または256
それは与えます指定されたキーはこのアルゴリズムに有効なサイズではありません
指定されたキーはこのアルゴリズムの有効なサイズではありません
なぜこれが起こるのか知りたいのですが?
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)
が抗議する可能性があります。)
これが、この「トリム」を実現するために使用したコードです。
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;
ここでの問題は、192ビットがC#の3DESでサポートされる最大のキーサイズであることです(そして私が想定している他の場所)。
http://msdn.Microsoft.com/en-us/library/system.security.cryptography.symmetricalgori ...
キーを16バイト/文字の値に設定してみましたか?
サポートされている他の唯一のサイズは128ビットのようです。もっと強力にしたい場合は、別のアルゴリズムAes/Rijndaelを使用する必要があります。
Wikipedia でTDESを検索すると、キーの最大サイズは168ビットと思われるため、Microsoftがどのように実装しているかはわかりません。
簡潔にするために、例から省略されたと思いますが、適切な量のソルトからキーをハッシュする必要があります。暗号名前空間には、このためのRNG/HSHアルゴリズムがいくつかあります。