Я работаю над расшифровкой данных, которые были зашифрованы с помощью 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 ==
Любая помощь приветствуется.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я чрезвычайно новичок в 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 для дешифрования.
Случайный ассортимент предложений и мыслей:
InitStr
является важной функцией ... Вы уверены, что она использует первые 16 байтов хэша SHA-1 в качестве ключевых данных?