Шифрование шифрования DCPcrypt в PyCrypto

1

Я работаю над расшифровкой данных, которые были зашифрованы с помощью DCPcrypt с использованием Rijndael. Я хотел использовать Python для его расшифровки, но у меня проблемы. Я упомянул, что я не особо криптоват (я учился в колледже, но об этом), и я тоже не программист Delphi, так что это также, вероятно, мешает моим попыткам расшифровать то, что именно делает DCPcrypt.

Это мясо кода Delphi:

Cipher: TDCP_rijndael;
begin
Cipher:= TDCP_rijndael.Create(nil);
Cipher.InitStr(PasswordField.Text);
Cipher.EncryptCBC(encryptString[1],encryptString[1],Length(encryptString));

Таким образом, реализация использует ключ (полученный из поля пароля), но не IV. PyCrypto, с другой стороны, требует IV. Поиск через внутреннюю часть кода DCPcrypt, кажется, что если значение IV равно нулю, то шифрование ECB используется для заполнения IV из строки 0xff?

procedure TDCP_rijndael.Init(var Key; Size: longint; IVector: pointer);
....
  if IVector= nil then
  begin
    FillChar(IV,Sizeof(IV),$FF);
    {$IFDEF CFORM}Encrypt(IV,IV){$ELSE}RijndaelEncryptECB(Data,IV,IV){$ENDIF};
    Move(IV,LB,Sizeof(LB));
  end

Похоже, я использую статический IV. Однако я не могу выполнить эту работу. Вот моя реализация в PyCrypto. Любые идеи, что я делаю неправильно?

key = "password"
s = hashlib.sha1()
s.update(key)
key = s.digest()
key = key[:16]

# Set up the IV, note that in ECB the third parameter to the AES.new function is ignored since ECB doesn't use an IV
ecb = AES.new(key, AES.MODE_ECB, '\xff' * 16)
iv = ecb.encrypt('\xff' * 16)

cipher = AES.new(key, AES.MODE_CFB, iv)
msg = cipher.decrypt(ct[:16])

У меня есть простой текст, который был зашифрован с использованием кода Delphi, а затем закодирован base64. Используемый ключ был строковым паролем, как указано в hardcoded. Используя мою реализацию, я дешифрую кучу искаженных байтов.

k8b + uce5Fkp7Hbk/CaGYcuEWTfxlI05as88lJL0mHmJxLsKWqki2YwiFPU9Rx8qiUC2cvWZrQIOnkw ==

Любая помощь приветствуется.

  • 0
    Похоже, что InitStr является важной функцией ... Вы уверены, что она использует первые 16 байтов хэша SHA-1 в качестве ключевых данных?
  • 0
    Узнайте, как вы можете указать IV, чтобы контролировать его. Они должны быть одинаковыми с обеих сторон. Кроме того, см. Мои замечания по поводу заполнения в stackoverflow.com/questions/11717471/delphi-encrypt-compendiun-5-2-vs-chilkat-encryption/
Показать ещё 6 комментариев
Теги:
encryption
pycrypto

2 ответа

0

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я чрезвычайно новичок в Python, но попробуйте это:

Попробуйте изменить

key = key[:16]

в

key = key + bytes([0,0,0,0])

Это даст вам 24-байтовый ключ, который, я думаю, должен работать.

DCP допускает любую длину ключа, тогда как Crypto настаивает на ключах 16, 24 или 32 байта. По умолчанию DCP будет использовать SHA1 для генерации ключа, который затем составляет 20 байтов. На основе этого DCP использует логику для длины ключа <= 24 и только нулевые пэды вместо ключа для ключевой строки <= 16, а именно для клавиши key [: 16].

Кроме того, не знаю, является ли это просто опечаткой, но попробуйте изменить режим AES

cipher = AES.new(key, AES.MODE_CFB, iv)

в

cipher = AES.new(key, AES.MODE_CBC, iv)

Это даст расшифровку вашего ввода. Но тогда вам нужно будет рассмотреть добавление исходного исходного текста, потому что DCP не работает (я думаю), но Crypto требует кратных 16 для дешифрования.

0

Случайный ассортимент предложений и мыслей:

  1. Статические IV, как правило, представляют собой угрозу безопасности, поскольку они открывают дверь для известных нападений с открытым текстом.
  2. Глядя на источник dcpcrypt, похоже, что существует метод определения IV. По какой-то причине, если не по какой-либо другой причине, кроме как исключить неправильный IV как источник ошибки?
  3. Аналогичным образом, вы можете экспериментировать с ECB вместо CBC, чтобы полностью исключить IV и изолировать проблему в IV или в другом месте (ключ, данные или конфигурация).
  • 0
    Я полагаю, я должен был быть более конкретным в отношении кода Delphi. Этот код уже написан и находится в производстве. У меня нет возможности изменить это. В противном случае я бы определенно указал свой IV. Я застрял с написанным кодом Delphi и должен заставить Python обходить его.
  • 0
    Я так и думал. Предложение 3 стоит - попробуйте временно переключиться в режим ecb, чтобы определить, есть ли у вас проблема с внутривенным введением или проблема с ключом (/ data?).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню