开发者

Encrypted string From Delphi to C#

i am trying to decrypt one string in c# encrypted in Delphi with Cipher1 3.0, Part I from Delphi Encryption Compendium. I use TCipher_Rijndael.

string that i encrypt is : this-is-a-test-example

password: pass

encrypted values is : iKBC8kX4ZEk4A1pCj6jwEegqjpxhqw==

When i try to decrypt this in c# i recive error: Length of the data to decrypt is invalid.

Did anyone have the same problem, and what is a solution?

Here is a decrypt method in 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;
    }

and here is encrypt code in Delphi:

with TCipher_Rijndael.Create('pass',  nil) do
      begin
        memo2.lines.add ( CodeString开发者_如何学C( 'this-is-a-test-example' , paEncode, fmtDEFAULT));
        Free;
      end;

Thanks.


You need to determine all of the details of how that value was encrypted:

  1. What block cipher mode of operation was used? ECB tends to be a default.
  2. What padding scheme was used? Perhaps no padding in your case.
  3. How was the key derived from the password? Perhaps with PBKDF2 or simply a MD5 hash.
  4. What was the initialization vector? Note that only some cipher modes require one.
  5. How was the output encoded? It appears to be Base64 encoding for you.

Only once you know exactly how it was encrypted can you reverse the process to properly decrypt it. You might want to try posting more code or details about how it was encrypted. Then someone might be able to determine how you need to go about decrypting it. I've seen this scenario with unknowns before and I managed to guess the details to find the answer. I tried a few common ways with your encrypted string, but I can't easily decrypt it without more details.


You are saying that you can encrypt in C# and decrypt in C#. You can also encrypt in C# and decrypt in Delphi. This means that your C# encryption is definitely fine. That leaves just one possible culprit: Delphi encryption.

So do this:

  • Encrypt in C#.
  • Encrypt in Delphi.
  • Compare the outputs.

They can't possibly be the same. See in what way they differ. Is one Base64-encoded and the other just raw bytes? Is one padded with == and the other not? Do they use different Base64 variants?


Try going the other way. i.e. encrypt the string in c# and see if it matches. See if your C# solution can even eat its own dogfood.


My guess is that the Delphi encryption encodes the string as an Ansi string (one byte per character) and the C# encryption encodes the string as a Unicode UTF16 string (two bytes per character). If you are using Delphi 2007 and below this is almost certainly the case.

PS The length of the encrypted string in Delphi is also a bit of a giveaway - 32 characters for a 22 character raw string implies one byte per character - this is not the case for C#.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜