从Delphi到C#的加密字符串

3
我正在尝试在C#中解密使用Delphi Encryption Compendium的Cipher1 3.0加密的一个字符串。我使用的是TCipher_Rijndael。
被加密的字符串为:this-is-a-test-example,
密码为:pass。
加密后的值为:iKBC8kX4ZEk4A1pCj6jwEegqjpxhqw==。
当我尝试在C#中解密时,我收到错误消息:Length of the data to decrypt is invalid。
是否有人遇到了同样的问题,并且知道解决方案?
下面是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
这似乎是编码问题 - 你在两个应用程序中如何转换为字符串? - Grant Thomas
在尝试解密之前,您是否将字符串解码为字节数组?您输入的加密字符串是使用Base64编码的--末尾的两个等号是一个提示。因此,首先您需要使用Convert.FromBase64String将它们转换为字节数组。 - Katie Kilian
C#加密后的结果是什么?C#能解密它的加密字符串吗? - caesay
是的,我已经回答过了。当我在C#中加密时,我也可以在C#中解密。 - buda
1
@buda:这里的问题是,C#加密结果与Delphi结果相同吗?它们有什么不同?回答这个问题将有助于您,也可能有助于我们找到问题所在。 - jachguate
显示剩余5条评论
4个回答

5

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

  1. 使用了什么块密码模式?ECB往往是默认值。
  2. 使用了什么填充方案?也许在您的情况下没有填充。
  3. 从密码中如何派生密钥?也许使用PBKDF2或简单的MD5哈希。
  4. 初始化向量是什么?请注意,只有某些密码模式需要它。
  5. 输出如何编码?对您来说,似乎是Base64编码。
只有当你确切地知道加密方式时,才能反向解密以正确解密它。 你可能想尝试发布更多代码或关于如何进行加密的详细信息。 然后,有人可能能够确定你需要如何解密它。 我以前见过这种未知情况this scenario,并且猜测了细节以找到答案。 我已经尝试了一些常见的方法,但是没有更多的细节,我无法轻松地解密它。

3
你说你可以在C#中进行加密并在C#中进行解密。你还可以在C#中加密并在Delphi中解密。这意味着你的C#加密肯定没问题。这就只留下了一个可能的罪犯:Delphi加密。
所以做这个:
  • 在C#中加密。
  • 在Delphi中加密。
  • 比较输出。
它们不可能完全相同。看看它们有什么区别。是一个使用Base64编码,而另一个只是原始字节吗?一个填充了==,而另一个没有?它们使用不同的Base64变体吗?

如果您在此处发布“加密”输出,我们将更有可能帮助您。 - enverpex

1

尝试另一种方式。即在C#中加密字符串并查看是否匹配。看看您的C#解决方案是否能够自食其果。


1
当我在C#中加密字符串并在C#中解密时,一切都正常。 - buda
那么从C#加密的字符串有多长? - Chris Thornton

0

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

PS:在 Delphi 中加密字符串的长度也是一个提示——对于一个 22 个字符的原始字符串,加密后的字符串长度为 32 个字符,这意味着每个字符一个字节——但在 C# 中并非如此。


确保 Delphi 使用的字符串编码为 UTF16(与 C# 相同),或者在 C# 中专门使用 Ansi 编码。 - Misha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接