加密字符串从Delphi到C#

我试图用Delphi Encryption Compendium中的Cipher1 3.0,第一部分解密在Delphi中加密的c#中的一个字符串。 我使用TCipher_Rijndael。

我加密的字符串是:this-is-a-test-example

密码:通过

加密值为:iKBC8kX4ZEk4A1pCj6jwEegqjpxhqw ==

当我尝试在c#中解密时,我发现错误:要解密的数据长度无效。

有没有人有同样的问题,什么是解决方案?

这是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; } 

这里是Delphi中的加密代码:

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

谢谢。

您需要确定该值如何加密的所有详细信息:

  1. 使用什么分组密码操作模式 ? 欧洲央行往往是违约。
  2. 使用了什么填充方案 ? 在你的情况下也许没有填充。
  3. 密钥是如何从密码派生的? 也许使用PBKDF2或简单的MD5哈希。
  4. 什么是初始化向量 ? 请注意,只有一些密码模式需要一个。
  5. 输出是如何编码的? 它似乎是Base64编码。

只有当您确切知道它是如何加密的时候才能反转该过程以正确解密它。 您可能想尝试发布更多代码或有关其加密方式的详细信息。 然后有人可能能够确定你需要如何解密它。 我以前见过这种情况未知,我设法猜测细节找到答案。 我尝试了一些加密字符串的常用方法,但如果没有更多详细信息,我就无法轻易解密。

您说您可以在C#中加密并在C#中解密。 您也可以在C#中加密并在Delphi中解密。 这意味着您的C#加密绝对没问题。 这只留下了一个可能的罪魁祸首:delphi加密。

这样做:

  • 在C#中加密。
  • 在Delphi中加密。
  • 比较输出。

他们不可能是一样的。 看看他们的不同之处。 是一个Base64编码而另一个只是原始字节? 用一个填充==而另一个没有填充吗? 他们使用不同的Base64变体吗?

试着走另一条路。 即加密c#中的字符串并查看它是否匹配。 看看你的C#解决方案是否甚至可以吃自己的狗食。

我的猜测是Delphi加密将字符串编码为Ansi字符串(每个字符一个字节),C#加密将字符串编码为Unicode UTF16字符串(每个字符两个字节)。 如果您使用Delphi 2007及以下版本,几乎可以肯定。

PS Delphi中加密字符串的长度也有点赠品 – 对于22个字符的原始字符串,32个字符表示每个字符一个字节 – 这不是C#的情况。