Кодирование и декодирование Base 64 можно легко выполнить с помощью стандартного модуля base64
.
Расшифровка и шифрование AES-256 в режиме CBC поддерживаются как PyCrypto, так и M2Crypto.
Единственная нестандартная (и самая сложная) часть - это вывод IV и ключа из пароля. OpenSSL делает это с помощью своей собственной EVP_BytesToKey
функции, которая описана на этой странице руководства. .
Эквивалент Python:
def EVP_BytesToKey(password, salt, key_len, iv_len):
"""
Derive the key and the IV from the given password and salt.
"""
from hashlib import md5
dtot = md5(password + salt).digest()
d = [ dtot ]
while len(dtot)<(iv_len+key_len):
d.append( md5(d[-1] + password + salt).digest() )
dtot += d[-1]
return dtot[:key_len], dtot[key_len:key_len+iv_len]
где key_len
- 32, а iv_len
- 16 для AES-256. Функция возвращает ключ и IV, которые вы можете использовать для расшифровки полезной нагрузки.
OpenSSL помещает и ожидает "соль" в первых 8 байтах зашифрованной полезной нагрузки.
Наконец, AES в режиме CBC может работать только с данными, выровненными по 16-байтовой границе. Используемое заполнение по умолчанию - PKCS # 7.
Таким образом, шаги для шифрования следующие:
- Сгенерируйте 8 байтов случайных данных в виде соли.
- Получите ключ AES и IV из пароля, используя соль из шага 1.
- Дополните входные данные PKCS # 7.
- Зашифруйте дополнение с помощью AES-256 в режиме CBC с ключом и IV из шага 2.
- Закодируйте в Base64 и выведите соль с шага 1.
- Закодируйте в Base64 и выведите зашифрованные данные с шага 4.
Шаги от расшифровки обратные:
- Декодируйте входные данные из Base64 в двоичную строку.
- Считайте первые 8 байтов декодированных данных солью.
- Получите ключ AES и IV из пароля, используя соль из шага 1.
- Расшифруйте оставшиеся декодированные данные с помощью ключа AES и IV из шага 3.
- Проверьте и удалите отступ PKCS # 7 из результата.
person
SquareRootOfTwentyThree
schedule
17.12.2012