【问题标题】:Encrypted string From Delphi to C#从 Delphi 到 C# 的加密字符串
【发布时间】:2011-04-16 23:43:09
【问题描述】:

我正在尝试使用 Cipher1 3.0 解密在 Delphi 中加密的 C# 中的一个字符串,来自 Delphi Encryption Compendium 的第一部分。 我使用 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;

谢谢。

【问题讨论】:

  • 这有编码问题的味道 - 你如何在两个应用程序中转换为字符串?
  • 您是否在尝试解密之前将字符串解码为字节数组?您输入的加密字符串使用 Base64 编码进行编码——末尾的两个等号是赠品。因此,首先您必须使用 Convert.FromBase64String 将它们转换为字节数组。
  • 当然,我将字符串转换为字节数组。
  • C#加密的话,加密后的结果是什么? C# 可以解密它的加密字符串吗?
  • @buda:这里的问题是,c#加密结果和Delphi结果一样吗?有什么不同?回答这个问题将帮助您,也许我们会找到问题所在。

标签: c# delphi aes encryption


【解决方案1】:

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

  1. 使用了什么block cipher mode of operation?欧洲央行往往是默认的。
  2. 使用了什么padding scheme?在您的情况下可能没有填充。
  3. 密码中的key derived 怎么样?可能使用 PBKDF2 或只是 MD5 哈希。
  4. initialization vector 是什么?请注意,只有某些密码模式需要一个。
  5. 输出是如何编码的?它似乎是 Base64 编码。

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

【讨论】:

    【解决方案2】:

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

    这样做:

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

    它们不可能相同。看看他们有什么不同。一个是 Base64 编码的,另一个是原始字节吗?一个用 == 填充,另一个没有?他们使用不同的 Base64 变体吗?

    【讨论】:

    • 如果您在此处同时发布两个“加密”输出,我们将更有机会为您提供帮助。
    【解决方案3】:

    尝试另辟蹊径。即在 c# 中加密字符串并查看它是否匹配。看看你的 C# 解决方案是否甚至可以吃掉自己的狗粮。

    【讨论】:

    • 当我在 c# 中加密字符串并在 c# 中解密时一切正常,一切正常。
    • 那么来自c#的加密字符串有多长?
    【解决方案4】:

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

    PS Delphi 中加密字符串的长度也有点令人费解 - 22 个字符的原始字符串的 32 个字符意味着每个字符一个字节 - C# 不是这种情况。

    【讨论】:

    • 确保Delphi使用的字符串编码是UTF16(和C#一样),或者在C#中专门使用Ansi编码。
    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 2018-04-16
    • 2022-11-18
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多