2011-07-24 130 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()); 
      } 
     } 
    } 
} 

但是當我加密的字符串,然後再對其進行解密和加密一次,加密字符串是不一樣的原先的加密了。所以這是第一個加密的字符串:

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

和來這裏的第二加密的字符串:

kEN0HUp/dqz8kXA7nYivJG6Jl3haL JjhBq1UfEtQTwaPwizW // 03M0UxF8dBuYZo2BoZ5vsVcXRJF1LpFZLWxDsdeKAC43L2K2OoYRxTn/dA6KmM13YS9xOezGiROQfVj5qrkdokJRCvj0gYfFoH2oeDGyN + EAw5

它們幾乎相同,只是這個 「Dgzsp697kj4 =」 中的第一個字符串。
有什麼問題?
在此先感謝。

+1

兩個DES和歐洲央行是不安全的。你應該使用AES和CBC。 – SLaks

+1

歐洲央行並非天生不安全。它對於正確的應用程序來說是一個很好的選擇。關鍵是在正確的問題上使用它。 – erickson

+0

Plain 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

我有類似的問題。您應該檢查空白區域沒有被附加到解密字符串的末尾。您可能需要關閉空白區域。