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



  • 1 L Поле Длина данных (40 байт)
    2 Поле C Не отправлять ответ
  • 3 M Поле Код производителя
  • 4 Поле M Код производителя
  • 5 Серийный номер поля A LSB (BCD)
  • 6 Полевой серийный номер (BCD)
  • 7 Полевой серийный номер (BCD) (=12345678)
  • 8 Полевой серийный номер MSB (BCD) счетчика газа
  • 9 A Полевая версия (или номер поколения)
  • 10 A Тип полевого устройства (Среда=газ)
  • 11 CI Field 7Ah означает 4-байтовый заголовок
  • 12 Номер доступа. Счетчик передачи
  • 13 RSSI RSSI E-G
  • 14 Конфигурация UEDDKKKK LenUbit0, LenEbit0, KDFSelection
  • 15 Конфигурация 00OMMMMM режим 9 AuthTagSize 12 байт
  • 16 Длина[E] Количество зашифрованных байт
  • 17 Длина Количество незашифрованных байт
  • 18 Счетчик MSB
  • 19 Счетчик ..
  • 20 Счетчик ..
  • 21 Счетчик LSB Счетчик
  • 22 DR1 DIF (8-значный BCD , Номер хранилища 0)
  • 23 DR1 VIF (м3 в литрах)
  • 24 Значение DR1 LSB
  • 25 Значение DR1
  • 26 Значение DR1
  • 27 Старший бит значения DR1
  • 28 Старший бит аутентификации AT1
  • 29 Аутентификация AT2
  • 30 Аутентификация AT3
  • 31 Аутентификация AT4
  • 32 AT5 Аутентификация
  • 33 Аутентификация AT6
  • 34 Аутентификация AT7
  • 35 Аутентификация AT8
  • 36 Аутентификация AT9
  • 37 Аутентификация AT10
  • 38 Аутентификация AT11
  • 39 Аутентификация AT12
  • 40 CRC 1
  • 41 CRC 1
  • Тег аутентификации: C60A187DE9AA4B8348544D07
  • Данные только для аутентификации:
  • Инициализация вектор: 19F82305664950036A440000
  • шифрованный текст: 25F16BC00FD2
  • И, конечно же, 128-битный ключ AES (формат 0000111100001111), я не буду его здесь публиковать :)< /li>

Зашифрованные данные
Зашифрованные данные — это данные, которые необходимо одновременно зашифровать и аутентифицировать. Длина зашифрованных данных E в байтах указывается в поле Длина (E), максимальная длина может составлять 255 байт или 65535 байт в соответствии с. формат, указанный в поле конфигурации CF. F1 − ввод алгоритма (P)1) = открытый текст2) Все многобайтовые поля располагаются в том же порядке, что и в передаваемом сообщении.
Незашифрованные данные
Незашифрованные данные — это данные, которые необходимо аутентифицировать, но не шифровать. Длина незашифрованных данных приложения U в байтах указывается полем Длина (U), максимальная длина которого может составлять 255 байт или 65535 байт в соответствии с. формат, указанный в поле конфигурации CF.
Данные, подлежащие только аутентификации (U), должны быть объединены в соответствии со следующей спецификацией в качестве входных данных для алгоритма:
Ввод алгоритма (A )1) = CI-поле || Доступ-Нет || Статус || Конфиг. поле CF || {Ключевая версия} || Длина (Е) || Длина (U) || Незашифрованные данные приложения
Все многобайтовые поля располагаются в том же порядке, что и в передаваемом сообщении. поля в фигурных скобках не могут передаваться и должны игнорироваться во время объединения полей, если они отсутствуют.
Тег аутентификации

Длина тега аутентификации в байтах является параметром безопасности, и его значение должно составлять 12 байт. Тег аутентификации соответствует защищенным данным C и A. Тег аутентификации полученного сообщения должен быть проверен перед дальнейшей обработкой сообщения.
Вектор инициализации GCM
Вектор инициализации IV по существу представляет собой одноразовый номер, значение, уникальное в пределах указанного контекста (безопасности), которое определяет вызов аутентифицированной функции шифрования для входных данных, подлежащих защите. IV представляет собой объединение двух полей, называемых фиксированным полем и полем вызова. Фиксированное поле должно идентифицировать физическое устройство.
(E) обычно контекст (безопасности) для экземпляра аутентифицированной функции шифрования. Поле вызова должно идентифицировать наборы входных данных для аутентифицированной функции шифрования в этом конкретном устройстве. Для любого данного ключа никакие два различных физических устройства не должны использовать одно и то же фиксированное поле, и никакие два различных набора входных данных для любого одного устройства не должны использовать одно и то же поле вызова.
Длина IV должна составлять 12 байтов. При этом: — Ведущие (т. е. самые левые) 8 байтов должны содержать фиксированное поле. Оно должно быть построено как значения объединенных полей данных, идентифицирующих физически размещающее устройство:
Фиксированное поле = идентификатор производителя || Идентификационный номер || Версия || Тип устройства; — Завершающие (т.е. самые правые) 4 байта должны содержать поле вызова.
Поле вызова должно быть целочисленным счетчиком, который связан со счетчиком сообщений. Разрядность фиксированного поля ограничивает количество отдельных физических устройств, которые могут реализовать функцию шифрования с аутентификацией для данного ключа, до 264. Длина поля вызова в битах ограничивает количество вызовов функции шифрования с аутентификацией до 232 с любым заданным значением. набор входных данных без нарушения требований уникальности.


< tr>
Производитель (сначала LSB)
Идентификационный номер (сначала LSB)
Версия
Тип устройства
Счетчик сообщений (сначала MSB)



  • Производитель (сначала LSB): Байт 11, 10
    Идентификационный номер (сначала младший бит): байты 9, 8, 7,6/li>
    Версия: байт 5/li>
    Тип устройства: байт 4/li>
    Счетчик сообщений (сначала старший бит): байты 3,2,1,0/li>


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

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

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

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

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

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

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