2011-07-24 35 views
3

私のアプリケーションでDES-ECB + base64暗号化を使用しています。それは私が「暗号」DES-ECB暗号化と復号化

public class Crypto 
{ 

    public static string Decrypt(string encryptedString) 
    { 
     DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider(); 
     desProvider.Mode = CipherMode.ECB; 
     desProvider.Padding = PaddingMode.PKCS7; 
     desProvider.Key = Encoding.ASCII.GetBytes("e5d66cf8"); 
     using (MemoryStream stream = new MemoryStream(Convert.FromBase64String(encryptedString))) 
     { 
      using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateDecryptor(), CryptoStreamMode.Read)) 
      { 
       using (StreamReader sr = new StreamReader(cs, Encoding.ASCII)) 
       { 
        return sr.ReadToEnd(); 
       } 
      } 
     } 
    } 

    public static string Encrypt(string decryptedString) 
    { 
     DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider(); 
     desProvider.Mode = CipherMode.ECB; 
     desProvider.Padding = PaddingMode.PKCS7; 
     desProvider.Key = Encoding.ASCII.GetBytes("e5d66cf8"); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
       byte[] data = Encoding.Default.GetBytes(decryptedString); 
       cs.Write(data, 0, data.Length); 
       return Convert.ToBase64String(stream.ToArray()); 
      } 
     } 
    } 
} 

と呼ばれるクラスのコードですが、私は、文字列を暗号化する際に、再びそれを解読し、1より多くの時間を暗号化し、暗号化された文字列となった暗号化された前回と同じではありません。だから、最初に暗号化された文字列です:

kEN0HUp/dqz8kXA7nYivJG6Jl3haLJjhBq1UfEtQTwaPwizW // 03M0UxF8dBuYZo2BoZ5vsVcXRJF1LpFZLWxDsdeKAC43L2K2OoYRxTn/dA6KmM13YS9xOezGiROQfVj5qrkdokJRCvj0gYfFoH2oeDGyN + EAw5Dgzsp697kj4 =

、ここでは、第二の暗号化された文字列が来ますkEN0HUp/dqz8kXA7nYivJG6Jl3haL JjhBq1UfEtQTwaPwizW // 03M0UxF8dBuYZo2BoZ5vsVcXRJF1LpFZLWxDsdeKAC43L2K2OoYRxTn/dA6KmM13YS9xOezGiROQfVj5qrkdokJRCvj0gYfFoH2oeDGyN + EAw5

彼らはこの "Dgzsp697kj4 =" の最初の文字列を除いて、ほぼ同じです。
どういうところが間違っていますか?
ありがとうございます。

+1

DESおよびECBの両方が安全ではありません。あなたはAESとCBCを使うべきです。 – SLaks

+1

ECBは本質的に安全ではありません。適切なアプリケーションに最適です。鍵は正しい問題でそれを使うことです。 – erickson

+0

平易なDES *が問題ですが。 – erickson

答えて

5

データを失っています。あなたはパディングアルゴリズムをできるようにEncryptFinalBlock()を呼び出す必要があり、あなたの暗号化()メソッドでは、それはパディングを追加できるように設定が完了していることを知っている:

using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateEncryptor(), CryptoStreamMode.Write)) 
{ 
    byte[] data = Encoding.Default.GetBytes(decryptedString); 
    cs.Write(data, 0, data.Length); 
    cs.FlushFinalBlock(); // <-- Add this 
    return Convert.ToBase64String(stream.ToArray()); 
} 
+0

ありがとうございます、今はすべてが完璧に動作します。 – Cracker

1

私にも同様の問題がありました。空白が復号化された文字列の最後に付加されていないことを確認する必要があります。空白を切り捨てる必要があるかもしれません。