2011-10-25 2 views
0

文字列をSystem.Security.Cryptography.DESで暗号化しようとしましたが、プログラムを実行するたびに暗号化の結果が変更されました。 アプリケーションを実行するたびに同じ結果を得る方法がわかりません。同じ結果を得るために追加する定数がありますか? 私は私がアプリケーションを開く次の時間にバイトの配列の結果を入力したときに、このコードでは「グーグル」DESクラスを使用してSystem.Security.Cryptographyを使用して暗号化する#

byte[] plaintextBytes = (new UnicodeEncoding()).GetBytes(expireddate); 
      SymmetricAlgorithm sa = DES.Create(); 
      MemoryStream msEncrypt = new MemoryStream(); 
      CryptoStream csEncrypt = new CryptoStream(msEncrypt, sa.CreateEncryptor(), CryptoStreamMode.Write); 
      csEncrypt.Write(plaintextBytes, 0, plaintextBytes.Length); 
      csEncrypt.Close(); 
      byte[] encryptedTextBytes = msEncrypt.ToArray(); 

は、このコードから「グーグル」のですか?入力したときに、私が欲しいですかあなたが暗号化された安全IV(初期化ベクトルに)あなたは、プレーンテキストを再暗号化するたびに生成され

MemoryStream msDecrypt = new MemoryStream(decodedlistbyte.ToArray()); 
      CryptoStream csDecrypt = new CryptoStream(msDecrypt, sa.CreateDecryptor(), CryptoStreamMode.Read); 
      byte[] decryptedTextBytes = new Byte[decodedlistbyte.Count]; 
      csDecrypt.Read(decryptedTextBytes, 0, decodedlistbyte.Count); 
      csDecrypt.Close(); 
      msDecrypt.Close(); 
      string decrypteddate = (new UnicodeEncoding()).GetString(decryptedTextBytes); 
+0

塩はおそらく毎回変わります。 (これは正しいことです!) –

+0

しかし、暗号化の後、私は別のPCで復号化するので、復号化の結果は暗号化で入力したものでなければなりません! – kartal

+0

鍵は安全でプライベートな鍵でなければなりません。塩はプレーンテキストで保存して共有できます。 –

答えて

0

AES(Rijndael)などの強力な対称鍵アルゴリズムを使用することをおすすめします。 .NETのRijndaelManagedクラスを見てください。同じ鍵を暗号化と復号化に使用することができます。これが対称アルゴリズムです。鍵のセキュリティは非常に重要なので、秘密にして安全に保管してください。

2

- これは良いですが、その値は、それぞれの時間を変更する必要があります。 IVは公開され、暗号鍵とは決して関連してはいけません。

しかし、Desはこれ以上安全なアルゴリズムではなく、私はRijndaelまたはtripple desに切り替えることをお勧めします。

+0

ok私が同じ別のPCで復号化アプリケーションを実行すると、私は文字列を取得したい重要なことについての問題はありません私は暗号化から得たバイトの配列 – kartal

+0

笑..いいえちょうど皇帝の暗号を使用して:-) –

+0

それは本当に彼の問題ではありません。彼がちょうどIVを混乱させた場合、彼のデータの最初の部分だけがガベージとなります。CBCモード解読の仕組みを思い出してください。 – imichaelmiers

0

@Rossと同じように、新しいを毎回使用する必要があるため、暗号化された文字列は異なっているという。

ただし、現在のコードでは、新しいキーIVを毎回使用しています。別のコンピュータで解読できるようにするには、自分でKeyとIVを設定するか、暗号化中に自動的にKeyとIVを設定する必要があります。

など。暗号化するとき

byte[] key = sa.Key; 
byte[] iv = sa.IV; 
ICryptoTransform ct = sa.CreateEncryptor(); 

たとえば、解読中(別のコンピュータで)

IVを暗号化されたデータとともに送信することができます。 秘密キーはもちろん、アウトオブバンドで送信/共有する必要があります。

0

あなたの問題は、彼の暗号テキストが違うということではありません。これは実際には暗号化方式の重要な特性です。

あなたの問題は、状態をリセットせずに同じ対称アルゴリズムオブジェクトを再利用しているか、スニペットからはわかりません。別のキーで対称アルゴリズムを再統合します。

解読するには、新しい対称アルゴリズムを生成し、sa.Keyとsa.IVを暗号化した値で使用するように設定します。重要なのは、鍵をしっかりと保管し、IVがランダムであることを確認してください(あなたが保管したデータにそれを組み込む必要があります)。 IVをハードコードしないでください。それは完全にinsecureです。

ちなみに、DESはむしろ安全ではありません(私は10年前に約3日ですべてのキーを試すことができます)。 AESManagedを使用してください。また、暗号は難しく、私はあなた自身でそれをすることをお勧めしません。あなたがしたい場合は、thisを見ることを検討してください、それはあなたがほしいと思うもののほとんどを行います。

関連する問題