2011-04-16 107 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