AES-128 GCM (аутентифицированное дешифрование в режиме Галуа/счетчика)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 AES-128 GCM (аутентифицированное дешифрование в режиме Галуа/счетчика)

Сообщение Anonymous »

Я пытаюсь расшифровать сообщение (полученное через Wireless M-Bus). Используемый метод — AES-128 GCM. У меня есть правильный ключ для этого. Я знаю это, потому что могу расшифровать полученные сообщения с помощью программы в Windows.
Однако теперь мне нужен сценарий Python, который может делать то же самое. Я уже получаю сообщения, но не знаю, как их расшифровать. Несмотря на обширный поиск в Google и использование ChatGPT, я так и не понял этого.
Насколько я понимаю, мне нужно включить в скрипт следующие данные:
  • Ключ (не буду его здесь публиковать, но его длина 32 символа (128 бит). 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00)
  • Дополнительные аутентифицированные данные (AAD)< /li>
    Тег аутентификации (он находится в конце сообщения)
  • Сообщение/зашифрованный текст (зашифрованная часть сообщение)
  • Nonce / IV
Вопрос 1:
Следует Я пытаюсь расшифровать все полученное сообщение, или только его зашифрованную часть, или все сообщение Wireless M-Bus?
Вопрос 2:
Правда ли? Nonce / IV относятся к одному и тому же?
Может кто-нибудь помочь мне понять что я делаю не так или чего не понимаю? Я постоянно получаю сообщение об ошибке.
Вот код, который я сейчас использую:

Код: Выделить всё

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend

def decrypt_aes_gcm(key, nonce, ciphertext, aad, tag):
"""
Decrypt AES-GCM encrypted data.

Args:
key (bytes): 16-byte AES key.
nonce (bytes): Nonce/IV (12 bytes typically).
ciphertext (bytes): Encrypted data.
aad (bytes): Additional Authenticated Data.
tag (bytes): Authentication tag.

Returns:
bytes: Decrypted plaintext.
"""
# AES-GCM Cipher
decryptor = Cipher(
algorithms.AES(key),
modes.GCM(nonce, tag),
backend=default_backend()
).decryptor()

# Add AAD if provided
if aad:
decryptor.authenticate_additional_data(aad)

# Decrypt the ciphertext
plaintext = decryptor.update(ciphertext) + decryptor.finalize()

return plaintext

# Voorbeelddata (vervang met je eigen waarden)
key = bytes.fromhex("00000000000000000000000000000000")  # 16 bytes
nonce = bytes.fromhex("0102030405060708090a0b0c")         # 12 bytes
ciphertext = bytes.fromhex("d9313225f88406e5a55909c5aff5269a")  # Encrypted data
aad = bytes.fromhex("feedfacedeadbeeffeedfacedeadbeef")   # AAD (optioneel)
tag = bytes.fromhex("5bc94fbc3221a5db94fae95ae7121a47")   # Authentication tag

try:
plaintext = decrypt_aes_gcm(key, nonce, ciphertext, aad, tag)
print("Decrypted message:", plaintext.decode())
except Exception as e:
print("Error during decryption:", str(e))

Я построил IV/Nonce в соответствии с руководством. Кроме того, я попытался ввести полученное сообщение как полностью, так и по частям в виде зашифрованного текста.
Это полное сообщение сообщения:
2;24.12.2024;08:40:04.150;COM3;08:36:54.255;-46,1 дБм;метр (P);C;B;Ok;0,003920 с;41;28 44 8F 19 49 66 05 23 50 03 7A 04 2B 01 29 06 00 00 00 44 6A 25 F1 6B C0 0F D2 C6 0A 18 7D E9 AA 4B 83 48 54 4D 07 CD 27
И вот в таблице:



Поле L
Поле C
M Поле1
M Поле2
Поле1
Поле2
Поле3
Поле4
Поле5
Поле6
Поле CI
Номер доступа
RSSI
Конфигурация1
Конфигурация2
Длина[E]
Длина
Счетчик1
Счетчик2
Счетчик3
Счетчик4
DR1_1
DR1_2
DR1_3
DR1_4
DR1_5
DR1_6
AT1
AT2
AT3
AT4
AT5
AT6
AT7
AT8
AT9
AT10
AT11
AT12
CRC 1
CRC 2




28
44
8F
19
49
66
05
23
50
03
7A
04
2B
01
29
06
00
00
00
44
6A
25
F1
6B
C0
0F
D2
C6
0A
18
7D
E9
AA
4B
83
48
54
4D
07
CD
27



  • тег аутентификации: C60A187DE9AA4B8348544D07
  • Данные для только аутентификация:
  • Вектор инициализации: 19F82305664950036A440000
  • шифрованный текст: 25F16BC00FD2
  • И, конечно же, 128-битный AES ключ (формат 0000111100001111) не поделюсь здесь:)


Подробнее здесь: https://stackoverflow.com/questions/793 ... decryption
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»