2011-02-24 72 views
2

我使用此代碼密型/解密C#和PHP之間的字符串:C#3des加密,如何知道它何時失敗?

class encryption 
{ 
    public string SimpleTripleDes(string Data) 
    { 
     byte[] key = Encoding.ASCII.GetBytes("[email protected]"); 
     byte[] iv = Encoding.ASCII.GetBytes("password"); 
     byte[] data = Encoding.ASCII.GetBytes(Data); 
     byte[] enc = new byte[0]; 
     TripleDES tdes = TripleDES.Create(); 
     tdes.IV = iv; 
     tdes.Key = key; 
     tdes.Mode = CipherMode.CBC; 
     tdes.Padding = PaddingMode.Zeros; 
     ICryptoTransform ict = tdes.CreateEncryptor(); 
     enc = ict.TransformFinalBlock(data, 0, data.Length); 
     return ByteArrayToString(enc); 
    } 

    public string SimpleTripleDesDecrypt(string Data) 
    { 
     byte[] key = Encoding.ASCII.GetBytes("[email protected]"); 
     byte[] iv = Encoding.ASCII.GetBytes("password"); 
     byte[] data = StringToByteArray(Data); 
     byte[] enc = new byte[0]; 
     TripleDES tdes = TripleDES.Create(); 
     tdes.IV = iv; 
     tdes.Key = key; 
     tdes.Mode = CipherMode.CBC; 
     tdes.Padding = PaddingMode.Zeros; 
     ICryptoTransform ict = tdes.CreateDecryptor(); 
     enc = ict.TransformFinalBlock(data, 0, data.Length); 
     return Encoding.ASCII.GetString(enc); 
    } 

    public static string ByteArrayToString(byte[] ba) 
    { 
     string hex = BitConverter.ToString(ba); 
     return hex.Replace("-", ""); 
    } 

    public static byte[] StringToByteArray(String hex) 
    { 
     int NumberChars = hex.Length; 
     byte[] bytes = new byte[NumberChars/2]; 
     for (int i = 0; i < NumberChars; i += 2) 
      bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
     return bytes; 
    } 
} 

現在我想要做的是什麼,知道什麼時候該解密失敗,失敗時它告訴我這個一個消息文本:

Could not find any recognizable digits 

我可以比較,爲解密的字符串卜,將這個「錯誤」的文字是相同的所有電腦上,即使他們的.NET的lib是從另一種語言?

+0

如果您在2011年使用三重DES,我會說它在您的代碼運行之前失敗了。 – whatsisname 2011-02-24 21:30:37

回答

1

「解密失敗」可能意味着很多事情。

  1. 您解密引擎TransformFinalBlock()拋出異常,因爲您提供的
  2. 您提供有效的,但不正確IV無效的密鑰或IV - 這可以得到照顧,因爲你知道他們正確的價值觀以及它們是如何保護。
  3. 您提供了正確的密鑰,但是錯誤的密碼(或篡改)。

1是算法失敗,可以處理。

對於2和3,不幸的是,沒有比較解密文本和信號明文,除非你引入一些額外的篡改檢查措施,否則很難知道'解密是否失敗',哈希是一個答案。在這兩種情況下,結果可能不一致。

篡改檢測在流密碼和分組密碼中都不太可能發生,因爲它們不是爲此設計的。您必須結合使用ctyptographic技術來創建一個reselient基礎設施。

如果你有一個.NET庫,旨在給出一個特定的消息,它是寫在什麼語言(我假設你是在談論一個CLS兼容的語言,C#,VB.NET等)並不重要以及運行什麼電腦,行爲應該是一致的。

編輯: 分組密碼隨時添加填充到您的明文不論鏈接使用加密之前獲得下一個完整的塊大小技術。解密應該刪除填充,但您可能會希望字符串以一個或多個空值終止。謹慎行事,並考慮保持數據的長度。