Я пытаюсь расшифровать сообщение (полученное через 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
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>
Я пытаюсь расшифровать сообщение (полученное через Wireless M-Bus). Используемый метод — AES-128 GCM. У меня есть правильный ключ для этого. Я знаю это, потому что могу расшифровать полученные сообщения с помощью программы в Windows. Однако теперь мне нужен сценарий Python, который может делать то же самое. Я уже получаю сообщения, но не знаю, как их расшифровать. Несмотря на обширный поиск в Google и использование ChatGPT, я так и не понял этого. Насколько я понимаю, мне нужно включить в скрипт следующие данные: [list] [*]Ключ (не буду его здесь публиковать, но его длина 32 символа (128 бит). 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00) [*]Дополнительные аутентифицированные данные (AAD)< /li> Тег аутентификации (он находится в конце сообщения) [*]Сообщение/зашифрованный текст (зашифрованная часть сообщение) [*]Nonce / IV [/list] [b]Вопрос 1:[/b] Следует Я пытаюсь расшифровать все полученное сообщение, или только его зашифрованную часть, или все сообщение Wireless M-Bus? [b]Вопрос 2:[/b] Правда ли? Nonce / IV относятся к одному и тому же? Может кто-нибудь помочь мне понять что я делаю не так или чего не понимаю? Я постоянно получаю сообщение об ошибке. Вот код, который я сейчас использую: [code]from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend
# 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))
[/code] Я построил IV/Nonce в соответствии с руководством. Кроме того, я попытался ввести полученное сообщение как полностью, так и по частям в виде зашифрованного текста. [b]Это полное сообщение сообщения:[/b] 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 [b]И вот в таблице:[/b]
Поле L Поле C M Поле1 M Поле2 Поле1 Поле2 Поле3 Поле4 Поле5 Поле6 Поле CI Номер доступа RSSI Конфигурация1 Конфигурация2 Длина[E] Длина[U] Счетчик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
[list] [*]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 Длина[U] Количество незашифрованных байт [*]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 [/list] [list] [*]Тег аутентификации: C60A187DE9AA4B8348544D07 [*]Данные только для аутентификации: [*]Инициализация вектор: 19F82305664950036A440000 [*]шифрованный текст: 25F16BC00FD2 [*]И, конечно же, 128-битный ключ AES (формат 0000111100001111), я не буду его здесь публиковать :)< /li> [/list] [b]Зашифрованные данные[/b] Зашифрованные данные — это данные, которые необходимо одновременно зашифровать и аутентифицировать. Длина зашифрованных данных E в байтах указывается в поле Длина (E), максимальная длина может составлять 255 байт или 65535 байт в соответствии с. формат, указанный в поле конфигурации CF. F1 − ввод алгоритма (P)1) = открытый текст2) Все многобайтовые поля располагаются в том же порядке, что и в передаваемом сообщении. [b]Незашифрованные данные[/b] Незашифрованные данные — это данные, которые необходимо аутентифицировать, но не шифровать. Длина незашифрованных данных приложения U в байтах указывается полем Длина (U), максимальная длина которого может составлять 255 байт или 65535 байт в соответствии с. формат, указанный в поле конфигурации CF. Данные, подлежащие только аутентификации (U), должны быть объединены в соответствии со следующей спецификацией в качестве входных данных для алгоритма: Ввод алгоритма (A )1) = CI-поле || Доступ-Нет || Статус || Конфиг. поле CF || {Ключевая версия} || Длина (Е) || Длина (U) || Незашифрованные данные приложения Все многобайтовые поля располагаются в том же порядке, что и в передаваемом сообщении. поля в фигурных скобках не могут передаваться и должны игнорироваться во время объединения полей, если они отсутствуют. [b]Тег аутентификации[/b]
Длина тега аутентификации в байтах является параметром безопасности, и его значение должно составлять 12 байт. Тег аутентификации соответствует защищенным данным C и A. Тег аутентификации полученного сообщения должен быть проверен перед дальнейшей обработкой сообщения. [b]Вектор инициализации GCM[/b] Вектор инициализации IV по существу представляет собой одноразовый номер, значение, уникальное в пределах указанного контекста (безопасности), которое определяет вызов аутентифицированной функции шифрования для входных данных, подлежащих защите. IV представляет собой объединение двух полей, называемых фиксированным полем и полем вызова. Фиксированное поле должно идентифицировать физическое устройство. (E) обычно контекст (безопасности) для экземпляра аутентифицированной функции шифрования. Поле вызова должно идентифицировать наборы входных данных для аутентифицированной функции шифрования в этом конкретном устройстве. Для любого данного ключа никакие два различных физических устройства не должны использовать одно и то же фиксированное поле, и никакие два различных набора входных данных для любого одного устройства не должны использовать одно и то же поле вызова. Длина IV должна составлять 12 байтов. При этом: — Ведущие (т. е. самые левые) 8 байтов должны содержать фиксированное поле. Оно должно быть построено как значения объединенных полей данных, идентифицирующих физически размещающее устройство: Фиксированное поле = идентификатор производителя || Идентификационный номер || Версия || Тип устройства; — Завершающие (т.е. самые правые) 4 байта должны содержать поле вызова. Поле вызова должно быть целочисленным счетчиком, который связан со счетчиком сообщений. Разрядность фиксированного поля ограничивает количество отдельных физических устройств, которые могут реализовать функцию шифрования с аутентификацией для данного ключа, до 264. Длина поля вызова в битах ограничивает количество вызовов функции шифрования с аутентификацией до 232 с любым заданным значением. набор входных данных без нарушения требований уникальности.
< tr> Производитель (сначала LSB) Идентификационный номер (сначала LSB) Версия Тип устройства Счетчик сообщений (сначала MSB)
[list] Производитель (сначала LSB): Байт 11, 10 Идентификационный номер (сначала младший бит): байты 9, 8, 7,6/li> Версия: байт 5/li> Тип устройства: байт 4/li> Счетчик сообщений (сначала старший бит): байты 3,2,1,0/li> [/list]
Я пытаюсь расшифровать сообщение (полученное через Wireless M-Bus). Используемый метод — AES-128 GCM. У меня есть правильный ключ для этого. Я знаю это, потому что могу расшифровать полученные сообщения с помощью программы в Windows.
Однако теперь...
Я пытаюсь расшифровать сообщение (полученное через Wireless M-Bus). Используемый метод — AES-128 GCM. У меня есть правильный ключ для этого. Я знаю это, потому что могу расшифровать полученные сообщения с помощью программы в Windows.
Однако теперь...
Я пытаюсь расшифровать сообщение (полученное через Wireless M-Bus). Используемый метод — AES-128 GCM. У меня есть правильный ключ для этого. Я знаю это, потому что могу расшифровать полученные сообщения с помощью программы в Windows.
Однако теперь...
Пожалуйста, помогите мне. Я хочу зашифровать с использованием алгоритма AES-GCM в коде c Sharp, ниже приведен мой код.
Однако он не может расшифровать. Я хочу сохранить код расшифровки.
Как решить эту проблему? Пожалуйста, помогите мне.
//...
Platform: React Native (Android)
Module Type: Turbo Module
Encryption: AES-GCM (with a 32-byte key)
языки: kotlin (для турбо -модуля) и Python (для тестирования)
Размеры файлов: