Python M2Crypto.EVP.Cipher не работает с зашифрованными данными C++

У меня есть некоторые данные, которые были зашифрованы с помощью OpenSSL в C++ с использованием aes_256_cbc, и мне нужно расшифровать их в Python. Я полагал, что использование M2Crypto, будучи оболочкой для OpenSSL, должно упростить это, но я не получаю те же данные.

Я прочитал test_AESкод, и это не помогло. Я получаю данные, это просто неправильные данные.

c = Cipher(alg='aes_256_cbc', key=binaryKey, iv=iv, op=0, d='sha256', i=5, salt=knownSalt, padding=0)
v = c.update(binaryDataToDecrypt)
v += c.final()

На данный момент afaik, v должны быть моими данными, а это не так... Я нашел еще один Q здесь, на SO, где упоминалось, что первые 16 байтов данных для расшифровки являются солью, поэтому я также безуспешно пробовал следующее:

c = Cipher(alg='aes_256_cbc', key=binaryKey, iv=iv, op=0, d='sha256', i=5, salt=binaryDataToDecrypt[0:16], padding=0)
v = c.update(binaryDataToDecrypt[16:])
v += c.final()

person Endophage    schedule 18.11.2011    source источник
comment
В AES/CBC нет соли. Хотя может случиться так, что он используется с паролем (и хеш-функцией/счетчиком итераций) для получения ключа... однако понятия не имею об OpenSSL/M2Crypto. Показ кода, используемого для шифрования, может помочь.   -  person Paŭlo Ebermann    schedule 18.11.2011


Ответы (1)


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

Кроме того, как упоминалось в комментариях Пауло, AES не использует соль, поэтому для этого параметра следует оставить значение по умолчанию.

person Endophage    schedule 07.01.2012