2011-04-16 210 views
3

我試圖解密在德爾福與Cipher1 3.0加密C#一個字符串,德爾福加密提綱A部分我。 我使用TCipher_Rijndael。加密字符串從德爾福C#

串,我加密是:這-是-A-測試示例

密碼:通過

加密的值是:iKBC8kX4ZEk4A1pCj6jwEegqjpxhqw ==

當我嘗試在c#i到解密此recive錯誤:解密數據的長度無效。

有沒有人有同樣的問題,什麼是解決方案嗎?

這裏是C#中的解密方法:

public static byte[] Decrypt(byte[] cipherData, 
           byte[] Key, byte[] IV) 
    { 

     MemoryStream ms = new MemoryStream(); 
     Rijndael alg = Rijndael.Create();  
     alg.Key = Key; 
     alg.IV = IV; 
     CryptoStream cs = new CryptoStream(ms, 
      alg.CreateDecryptor(), CryptoStreamMode.Write);   
     cs.Write(cipherData, 0, cipherData.Length);  
     cs.Close(); 
     byte[] decryptedData = ms.ToArray(); 
     return decryptedData; 
    } 

這裏是加密代碼德爾福:

with TCipher_Rijndael.Create('pass', nil) do 
     begin 
     memo2.lines.add (CodeString('this-is-a-test-example' , paEncode, fmtDEFAULT)); 
     Free; 
     end; 

感謝。

+1

這種編碼問題的氣味 - 你如何在兩個應用程序轉換爲字符串? – 2011-04-16 23:46:18

+0

在嘗試解密之前,您是否將字符串解碼爲字節數組?您輸入的加密字符串使用Base64編碼進行編碼 - 最後兩個等號表示贈品。所以首先你必須使用Convert.FromBase64String將它們轉換爲一個字節數組。 – 2011-04-16 23:54:53

+0

當然,我將字符串轉換爲字節數組。 – buda 2011-04-17 00:01:57

回答

1

嘗試去其他方式。即在c#中加密字符串並查看它是否匹配。看看你的C#解決方案是否可以吃自己的狗糧。

+1

當我在c#中加密字符串並在c#中解密時,一切正常,這一切正常。 – buda 2011-04-16 23:48:09

+0

那麼從c#加密的字符串需要多長時間? – 2011-04-17 19:09:36

3

你是說,你可以在C#加密和C#解密。您也可以在C#中進行加密並在Delphi中進行解密。這意味着你的C#加密絕對沒問題。這留下了一個可能的罪魁禍首:德爾福加密。

所以做到這一點:

  • 加密在C#。在Delphi中加密。
  • 加密在Delphi中。
  • 比較輸出。

他們不可能是相同的。看他們有什麼不同。是一個Base64編碼和其他只是原始字節?一個用==填充,另一個不用?他們是否使用不同的Base64變種?

+0

如果您也在這裏發佈「加密」輸出,我們將有更好的機會幫助您。 – enverpex 2011-04-17 01:34:01

5

您需要確定所有的細節值的加密方式:

  1. 用什麼block cipher mode of operation? ECB往往是違約。
  2. 使用什麼padding scheme?你的情況可能沒有填充。
  3. key derived如何從密碼?也許與PBKDF2或只是一個MD5散列。
  4. 什麼是initialization vector?請注意,只有一些密碼模式需要一個。
  5. 輸出是如何編碼的?它似乎是Base64編碼給你的。

只有一旦你確切地知道它是如何加密的,你可以逆轉這個過程來正確解密它。您可能想嘗試發佈更多代碼或有關加密方式的詳細信息。然後有人可能能夠確定你需要如何解密它。我以前見過this scenario以及未知數,我設法猜測細節以找到答案。我嘗試了使用加密字符串的一些常用方法,但如果沒有更多細節,我不能輕易解密它。

0

我的猜測是,Delphi加密將字符串編碼爲Ansi字符串(每個字符一個字節),並且C#加密將字符串編碼爲Unicode UTF16字符串(每個字符兩個字節)。如果您使用的是Delphi 2007及以下版本,則幾乎肯定是這種情況。

PS在Delphi中加密字符串的長度也是一個贈品 - 22個字符原始字符串的32個字符意味着每個字符一個字節 - 這不是C#的情況。

+0

好的,什麼是解決方案? – buda 2011-04-28 08:03:08

+0

確保Delphi使用的字符串編碼是UTF16(與C#相同),或者在C#中專門使用Ansi編碼。 – Misha 2011-05-02 01:53:11