Расшифровывая шифр AES-256-CB C с паролем, созданным с использованием PBKDF2 в Python - PullRequest
1 голос
/ 23 апреля 2020

У меня есть зашифрованный сеансовый ключ, который мне нужно расшифровать с помощью python, и я действительно не знаю, как go узнать об этом.

Мне предоставили парольную фразу, соль и hma c ключ Строка, которую мне нужно декодировать, закодирована в base64, а при декодировании - это ключ, обозначенный каналом, и дата окончания срока действия (сеансовый ключ + разделитель канала + дата и время)

Ключ сеанса шифруется "с использованием AES-256-CB C шифр с паролем, созданный с использованием PBKDF2 - Функция получения ключа на основе пароля 2. Зашифрованная полезная нагрузка затем подписывается ключом HMA C. "

Как мне go узнать об этом, используя Python? Каковы лучшие библиотеки для этого?

Ниже приведена одна из моих многочисленных попыток (отредактировано на основе комментария @ topaco ):

from base64 import b64decode
import hashlib
import pyaes
import os

PASSWORD = b"password provided"
SALT = b"Salt provided"
iv = os.urandom(16)
ciphertext = "message to decode"


passcode = hashlib.pbkdf2_hmac('sha256', PASSWORD, SALT, 1000)
aes = pyaes.AESModeOfOperationCBC(passcode, iv=iv)
encrypter = pyaes.Encrypter(pyaes.AESModeOfOperationCBC(passcode, iv))
decrypter = encrypter.feed(ciphertext)
decrypter += encrypter.feed()

1 Ответ

0 голосов
/ 24 апреля 2020

В размещенном коде шифрование и дешифрование перепутаны. Для расшифровки pyaes.Decrypter требуется.

В следующем фрагменте кода PBKDF2 используется для генерации 32-байтового ключа, который применяется для шифрования открытого текста и дешифрования результирующего зашифрованного текста с использованием AES-256-CB C:

from base64 import b64encode
import hashlib
import pyaes
import os

plaintext = 'The quick brown fox jumps over the lazy dog'
password = b'password provided'
salt = b'Salt provided'
iterationCount = 1000

# Create random 16 bytes IV 
iv = os.urandom(16)

# Create 32 bytes key
key = hashlib.pbkdf2_hmac('sha256', password, salt, iterationCount)

# Encryption with AES-256-CBC
encrypter = pyaes.Encrypter(pyaes.AESModeOfOperationCBC(key, iv))
ciphertext = encrypter.feed(plaintext.encode('utf8'))
ciphertext += encrypter.feed()

# Decryption with AES-256-CBC
decrypter = pyaes.Decrypter(pyaes.AESModeOfOperationCBC(key, iv))
decryptedData = decrypter.feed(ciphertext)
decryptedData += decrypter.feed()

# Display results
def printData(text, data):
    print(text + " (hex):    " + data.hex()) 
    print(text + " (Base64): " + b64encode(data).decode('utf8') + "\n")

printData("16 bytes IV", iv)
printData("32 bytes Key", key)
printData("Ciphertext", ciphertext)
print("Decrypted data (UTF-8): " + decryptedData.decode('utf8') + "\n")

Примечание:

  • В вашем описании дайджест и количество итераций не упоминаются. В размещенном коде используется SHA256 и счет 1000. Оба параметра являются критическими, то есть для дешифрования должны использоваться те же параметры, что и для шифрования.

    Кроме того, IV обычно генерируется во время шифрования (а не во время дешифрования) и передается вместе с зашифрованным текстом.

  • Согласно вашему описанию PBKDF2, AES- CB C и HMA C. Обычно в этом созвездии генерируются ключи PBKDF2, которые используются для шифрования открытого текста (здесь используется AES-CB C) и для генерации MA C для аутентификации сообщения.

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

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

    Связанный вариант разделяет сгенерированный 32-байтовый ключ на два 16-байтовых ключа для шифрования и аутентификации. Таким образом, выполняется шифрование с помощью AES-128, которое отличается от описанного вами шифрования AES-256.

    Вкратце: для успешного выполнения расшифровки и аутентификации должна быть известна определенная информация. В дополнение к генерации ключей это включает генерацию IV, генерацию MA C (данные которой используются для генерации MA C), конкатенацию данных (порядок шифрования, IV и MA C) и т. Д. c.

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