Зашифрованная строка из Delphi в C # - PullRequest
3 голосов
/ 17 апреля 2011

Я пытаюсь расшифровать одну строку в c #, зашифрованную в Delphi с помощью Cipher1 3.0, часть I из Delphi Encryption Compendium.Я использую TCipher_Rijndael.

строка, которую я зашифровываю: это пример теста

пароль: пароль

Зашифрованные значения: 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 ]

5 голосов
/ 17 апреля 2011

Вам необходимо определить все детали того, как это значение было зашифровано:

  1. Какой режим работы блочного шифра использовался? ЕЦБ, как правило, по умолчанию.
  2. Какая схема заполнения была использована? Возможно, нет подкладки в вашем случае.
  3. Как ключ был получен из пароля? Возможно с PBKDF2 или просто MD5 хеш.
  4. Что такое вектор инициализации ? Обратите внимание, что только для некоторых режимов шифрования требуется один.
  5. Как был закодирован выход? Похоже, это кодировка Base64 для вас.

Только после того, как вы точно знаете, как он был зашифрован, вы можете полностью изменить процесс и правильно его расшифровать. Возможно, вы захотите опубликовать больше кода или подробностей о том, как он был зашифрован. Тогда кто-то может определить, как вам нужно расшифровать его. Я видел этот сценарий с неизвестными ранее, и мне удалось угадать детали, чтобы найти ответ. Я пробовал несколько распространенных способов с вашей зашифрованной строкой, но я не могу легко расшифровать ее без более подробной информации.

3 голосов
/ 17 апреля 2011

Вы говорите, что можете шифровать в C # и дешифровать в C #.Вы также можете зашифровать в C # и расшифровать в Delphi.Это означает, что ваше шифрование C # определенно хорошо.Это оставляет только одного возможного виновника: шифрование Delphi.

Так сделайте это:

  • Шифрование в C #.
  • Шифрование в Delphi.
  • Сравнитьвыходы.

Они не могут быть одинаковыми.Посмотрите, чем они отличаются.Один Base64-кодированный, а другой просто необработанные байты?Один дополнен ==, а другой нет?Используют ли они разные варианты Base64?

1 голос
/ 17 апреля 2011

Попробуйте пойти другим путем.т.е. зашифровать строку в c # и посмотреть, если она совпадает.Посмотрите, может ли ваше решение C # даже съесть свою собачью еду.

0 голосов
/ 17 апреля 2011

Я предполагаю, что шифрование Delphi кодирует строку в виде строки Ansi (один байт на символ), а шифрование C # кодирует строку в виде строки Unicode UTF16 (два байта на символ).Если вы используете Delphi 2007 и ниже, это почти наверняка имеет место.

PS Длина зашифрованной строки в Delphi также немного дешевая - 32 символа для необработанной строки из 22 символов подразумевают один байт насимвол - это не так для C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...