加密字符串从Delphi到C#

时间:2011-04-16 23:43:09

标签: c# delphi aes encryption

我正在尝试使用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;

感谢。

4 个答案:

答案 0 :(得分:5)

您需要确定该值的加密方式的所有细节:

  1. 使用了什么block cipher mode of operation?欧洲央行往往是违约。
  2. 使用了什么padding scheme?在你的情况下也许没有填充。
  3. 密码中的key derived是怎样的?可能使用PBKDF2或仅使用MD5哈希。
  4. initialization vector是什么?请注意,只有一些密码模式需要一个。
  5. 输出是如何编码的?它似乎是Base64编码。
  6. 只有当您确切知道它是如何加密的时候才能反转过程以正确解密它。您可能想尝试发布更多代码或有关其加密方式的详细信息。然后有人可能能够确定你需要如何解密它。我之前见过this scenario未知数,我设法猜测细节以找到答案。我尝试了一些使用加密字符串的常用方法,但如果没有更多详细信息,我就无法轻易解密。

答案 1 :(得分:3)

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

这样做:

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

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

答案 2 :(得分:1)

尝试另一种方式。即加密c#中的字符串并查看它是否匹配。看看你的C#解决方案是否可以吃自己的狗食。

答案 3 :(得分:0)

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

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