Однако теперь мне нужен сценарий 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
Следует Я пытаюсь расшифровать все полученное сообщение, или только его зашифрованную часть, или все сообщение 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))
Это полное сообщение сообщения:
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