Pre-Release -- Neues Plugin: P1 Decrypter
Einklappen
X
-
Laut meinen Quellen verwendet die Energie Steiermark bei Sagemcom T210 Zähler P1 mit dem FTDI Chip und nicht das M-Bus Interface oder hast du genau diesen Adapter im Einsatz zusammen mit dem Sagemcom T210 Zähler. M-Bus scheint bei Landis+Gyr im Einsatz zu sein und nicht bei Sagemcom. -
Hallo
Ich habe einen T210 (V0125) und den Freigabeschlüssel von der EVN.
Habe am Loxberry (V2.2.2) das Plugin "P1-Decrypter" installiert.
P1 habe ich mit einem MBus->USB Adapter mit dem Loxberry verbunden. (https://www.amazon.de/ZTSHBK-USB-zu-...s%2C127&sr=8-3)
Die Baudrate habe ich im Plugin auf 2400 gestellt.
So wies aussieht, hat mein SmartMeter das Problem mit dem L-Field.
Anbei das Log. (WARNING Expected 0x82 separator byte not found, dropping frame)
Kann ich das Problem irgendwie im Script selbst lösen?
Alternativ gäbe es ja auch diese Lösung von greenmikeeu: (Das Script kommt anscheinend mit dem Problem klar hab ich wo gelesen.)
https://www.michaelreitbauer.at/sage...art-meter-evn/
Aber dafür benötige ich einen 2ten Rasp.
Oder gibts da eine Lösung, dass ich das von greenmikeeu auch am Loxberry installiere?
Danke und LgAngehängte DateienZuletzt geändert von DopplR; 13.01.2023, 08:05.Kommentar
-
Hallo,
Ich hab auch mal gespielt und getestet ob das Plugin zum funktionieren bringe.
1. Bin ich zu Blöd damit ich alle einstellungen kapier, kannst du hier ein kurze Anleitung geben?
Ok die Baudt Rate hab ich mal auf 2400 gestellt, das weiß ich noch, aber ob der default "Additional Authenticated Data" stimmt!?
der schaut mehr nach dummy 1234... aus, und ich hab keinen Plan von wo ich den her nehmen soll?!
2. hab ich auch einige Log Fehler, de frage stellt sich mir hab ich hsw. auch den Frame Längen Fehler oder passt was anders nicht aber manchmal sollte es ja funktionieren?
2023-04-13 15:26:23 root DEBUG STATE_IGNORING: Start byte has been detected: (b'db')
2023-04-13 15:26:23 root DEBUG STATE_STARTED: Length of system title: (8)
2023-04-13 15:26:23 root DEBUG STATE_HAS_SYSTEM_TITLE_LENGTH: System title: (b'5341475905e79c81')
2023-04-13 15:26:23 root WARNING Expected 0x82 separator byte not found, dropping frame
2023-04-13 15:26:23 root DEBUG Buffer (b'db085341475905e79c81')
2023-04-13 15:26:14 root DEBUG STATE_STARTED: Length of system title: (69)
2023-04-13 15:26:18 root DEBUG STATE_HAS_SYSTEM_TITLE_LENGTH: System title: (b'd528894f4e166801016853ff000167db085341475905e79 c8181f820005ffd2e384b7722304294990a54e9fc38579864c 8ff35ed5d932ed3fe18aedf4ef677e65f819f0b97')
2023-04-13 15:26:18 root WARNING Expected 0x82 separator byte not found, dropping frame
2023-04-13 15:26:18 root DEBUG Buffer (b'db45d528894f4e166801016853ff000167db08534147590 5e79c8181f820005ffd2e384b7722304294990a54e9fc38579 864c8ff35ed5d932ed3fe18aedf4ef677e65f819f0b97')
2023-04-13 15:26:18 root DEBUG STATE_IGNORING: Wait for start byte, got: (b'78')
2023-04-13 15:26:04 root DEBUG STATE_IGNORING: Start byte has been detected: (b'db')
2023-04-13 15:26:04 root DEBUG STATE_STARTED: Length of system title: (198)
2023-04-13 15:26:09 root DEBUG STATE_HAS_SYSTEM_TITLE_LENGTH: System title: (b'e8baf7166801016853ff000167db085341475905e79c818 1f820005ffd2cdd3250f111b84992fdce5953ea7cf2a3b4b95 e52412136d18890ed3b569648b13844a0dd3f6352c97a4be39 c3e9d0d72419aac6b594c6ed40625f29132b01b21bedb21bc4 52f71fb4b145015c1ff607bbc50be05c4b0f8597f861b78c21 262cf8543708220fdfc41925341c56a2fcc4e17be284e73238 8e02901b0f7a860f49a508fbe1ab0e21e1bf28f9b66246d967 0cefb282bf70a9ac95a9283cae12e3f89332ec66afafcbffa' )
2023-04-13 15:26:09 root WARNING Expected 0x82 separator byte not found, dropping frame
2023-04-13 15:26:09 root DEBUG Buffer (b'dbc6e8baf7166801016853ff000167db085341475905e79 c8181f820005ffd2cdd3250f111b84992fdce5953ea7cf2a3b 4b95e52412136d18890ed3b569648b13844a0dd3f6352c97a4 be39c3e9d0d72419aac6b594c6ed40625f29132b01b21bedb2 1bc452f71fb4b145015c1ff607bbc50be05c4b0f8597f861b7 8c21262cf8543708220fdfc41925341c56a2fcc4e17be284e7 32388e02901b0f7a860f49a508fbe1ab0e21e1bf28f9b66246 d9670cefb282bf70a9ac95a9283cae12e3f89332ec66afafcb ffa')
2023-04-13 15:26:09 root DEBUG STATE_IGNORING: Wait for start byte, got: (b'a1')
3. Wenns Funktionierts wärs ein cooles Plugin und ich würd dich feiern, wenns geht gibts auch Trinkgeld1 BildKommentar
-
Kapier i jetzt ned, der Ersteller des Plugin Metrophos, schreibt beim 1. Post:
"Testen konnte ich es bisher mit meinem Smart Meter (Sagemcom T210-D-r) in Österreich"
also gehts jetzt doch nicht mit dem plugin? -
Die BISHERIGEN Versionen des Plugin scheinen nur mit Stromzählern der ENERGIE STEIERMARK mit P1-Schnittstelle zusammen zu arbeiten. Der Entwickler scheint aber an einer Erweiterung für andere Netzbetreiber zu arbeiten. Für EVN (Netz NÖ) gab es aber hier bereits einen Beitrag (https://www.loxforum.com/forum/proje...220#post371220) von einem anderen Benutzer der auf Anfrage per E-Mail geeignete Software zur Verfügung stellt.
-
-
Hallo,
1. Bin ich zu Blöd damit ich alle einstellungen kapier, kannst du hier ein kurze Anleitung geben?
Ok die Baudt Rate hab ich mal auf 2400 gestellt, das weiß ich noch, aber ob der default "Additional Authenticated Data" stimmt!?
der schaut mehr nach dummy 1234... aus, und ich hab keinen Plan von wo ich den her nehmen soll?!
1 BildKommentar
-
"Additional Authenticated Data" wird für NetzNoe nicht benötigt.
Patchy Hast du das nun zum Laufen gebracht?Kommentar
-
reboot hat geholfen, aber auch ohne den additional auth data, kommt nix an.
2023-04-18 16:57:07 root DEBUG STATE_IGNORING: Start byte has been detected: (b'db')
2023-04-18 16:57:07 root DEBUG STATE_STARTED: Length of system title: (8)
2023-04-18 16:57:07 root DEBUG STATE_HAS_SYSTEM_TITLE_LENGTH: System title: (b'5341475905e79c81')
2023-04-18 16:57:07 root WARNING Expected 0x82 separator byte not found, dropping frame
2023-04-18 16:57:07 root DEBUG Buffer (b'db085341475905e79c81')
2023-04-18 16:57:07 root DEBUG STATE_IGNORING: Wait for start byte, got: (b'f8')
...
2023-04-18 16:57:52 root DEBUG STATE_IGNORING: Start byte has been detected: (b'db')
2023-04-18 16:57:52 root DEBUG STATE_STARTED: Length of system title: (84)
2023-04-18 16:57:53 root DEBUG STATE_HAS_SYSTEM_TITLE_LENGTH: System title: (b'66bcdac80cac62fa8d6ed0998ea6089745da302717597fd a3b6029b2967188f2ee578e5c7f59b302482da7e7fcde85f95 c218d8066a4a2a4be6d0d08785bce9aee0fe17fa7766eb411f 7314d254296ae509878a7')
2023-04-18 16:57:53 root WARNING Expected 0x82 separator byte not found, dropping frame
2023-04-18 16:57:53 root DEBUG Buffer (b'db5466bcdac80cac62fa8d6ed0998ea6089745da3027175 97fda3b6029b2967188f2ee578e5c7f59b302482da7e7fcde8 5f95c218d8066a4a2a4be6d0d08785bce9aee0fe17fa7766eb 411f7314d254296ae509878a7')
2023-04-18 16:57:53 root DEBUG STATE_IGNORING: Wait for start byte, got: (b'9d') -
Hallo,
Ja 32 Stellen und aus den pdf von NETZ NÖ Kopiert
Blöde Frage, im Log müsste ich es schon sehen wenns funktioniert?
Hab jetzt die Verbindung zu Loxone noch nicht programmiert, weil ja immer fehler kommen.Zuletzt geändert von Patchy; 18.04.2023, 17:49.
-
-
"Additional Authenticated Data" wird für NetzNoe nicht benötigt.
Patchy Hast du das nun zum Laufen gebracht?
Hier meine Aktuellen einstellungen1 BildKommentar
-
Hi!
Ich würde gerne ein neues Release zum Plugin erstellen und darin im optimal Fall eure Erkenntnisse einbringen und ein paar Probleme lösen, falls möglich. Dazu hätte ich folgende Fragen, gerne auch per PM:- Funktioniert dein Smartmeter?
- Welchen Smartmeter und Netzanbieter hast du?
- Kannst du mir deine Einstellungen senden?
- Funktioniert dein Smartmeter nicht?
- Welchen Smartmeter und Netzanbieter hast du?
- Hast du vielleicht alternative Skripte oder dergleichen zum Laufen gebracht?
Liebe Grüße,
DanielKommentar
- Funktioniert dein Smartmeter?
-
Habs jetzt eingerichtet. Datenübertragung klappt aber anscheinend nicht. Metrophos habe dir eine DM geschickt.
Code:2023-11-10 14:22:52 root DEBUG STATE_IGNORING: Wait for start byte, got: (b'04') 2023-11-10 14:22:52 root DEBUG STATE_IGNORING: Wait for start byte, got: (b'db') 2023-11-10 14:22:52 root DEBUG STATE_IGNORING: Start byte has been detected: (b'db') 2023-11-10 14:22:52 root DEBUG STATE_STARTED: Length of system title: (148) 2023-11-10 14:22:57 root DEBUG STATE_HAS_SYSTEM_TITLE_LENGTH: System title: (b'75e3b1d376286a3e5e8551564a97b162e8a98b1569190d0d5c5934d35eaed72fb201ddfd6292ae442f54b46c84ad62a90590a46007c9d0d0492dfffd6292efb27d714df5295fb0bfc0f3f9777032a6611ec937a3197e0b1ef82395ae33112d8596efca729a71aedb6155b036f12126e97255f98bde1e247f7f1a9293874722e7ad42ba5eda516133f52f222be72b3433d3c7c82c') 2023-11-10 14:22:57 root WARNING Expected 0x82 separator byte not found, dropping frame 2023-11-10 14:22:57 root DEBUG Buffer (b'db9475e3b1d376286a3e5e8551564a97b162e8a98b1569190d0d5c5934d35eaed72fb201ddfd6292ae442f54b46c84ad62a90590a46007c9d0d0492dfffd6292efb27d714df5295fb0bfc0f3f9777032a6611ec937a3197e0b1ef82395ae33112d8596efca729a71aedb6155b036f12126e97255f98bde1e247f7f1a9293874722e7ad42ba5eda516133f52f222be72b3433d3c7c82c') 2023-11-10 14:22:57 root DEBUG STATE_IGNORING: Wait for start byte, got: (b'33') 2023-11-10 14:22:57 root DEBUG STATE_IGNORING: Wait for start byte, got: (b'11')
Code:2023-11-10 14:30:22 root DEBUG STATE_IGNORING: Start byte has been detected: (b'db') 2023-11-10 14:30:22 root DEBUG STATE_STARTED: Length of system title: (4) 2023-11-10 14:30:22 root DEBUG STATE_HAS_SYSTEM_TITLE_LENGTH: System title: (b'e40cd424') 2023-11-10 14:30:22 root WARNING Expected 0x82 separator byte not found, dropping frame 2023-11-10 14:30:22 root DEBUG Buffer (b'db04e40cd424') 2023-11-10 14:30:22 root DEBUG STATE_IGNORING: Wait for start byte, got: (b'11')
P.S. Habe den Sagemcom T210-D (ohne -r).
Das steht am Zähler:
F.F Fehlermeldung
0.1.2 - Datum/Uhrzeit der Rückstellung
1.8.0 - Wirkenergie W+, Summe kWh
1.8.T - Wirkenergie W+, T=Tarifregister kWh
2.8.0 - Wirkenergie W-, Summe kWh
1.6.0 - Wirkleistung P+, mit Datum/Uhrzeit kW
2.6.0 - Wirkleistung P-, mit Datum/Uhrzeit kW
0.9.x x=1: Uhrzeit, x=2: Datum (tt.mm.j)
0.2. y y=0: Firmware, y=8: FW Signatur
P.01 15 min (W+, W-) kWh -...mit 2 Vorwerten
Bringt das Skript von GreenMike einen Hinweis? Zuletzt geändert von longtom; 10.11.2023, 15:00.Kommentar
-
Ok, ich glaube ich habs gefunden,
Es geht mit dem T210-D NICHT.
Der hat nämlich M-Bus und nicht das P1 Protokoll.
Beispiel Sagemcom T210-D-r auslesen via KundenschnittstelleWARNUNG
Dieses Beispiel ist nur für den Sagemcom T210-D -r (STRICH "R") gültig!
Der Sagemcom T210-D (ohne -r) nutzt ein anderes Protokoll.
Der Sagemcom T210-D-r wird unter anderem von der "Energienetze Steiermark" verbaut, das Beispiel sollte aber für alle Netzbetreiber gültig sein.
Kommentar
-
Frage an die/den Entwickler:
Wäre es denkbar das Plugin für mehrere Zähler auszulegen?
Auf der Busleitung könnte man ja auch 2-3 Zähler (kommt auf das Schnittstellenmodul und die Spannungsversorgung an) "auffädeln".
Die aktuelle Konfigurationsmaske lässt ja nur die Konfiguration eines Keys zu.
Ich hab aktuell 2 Zähler verbaut und die haben einen unterschiedlichen Schlüssel.Kommentar
-
Hi Metrophos,
zunächst einmal Gratulation zu deinem gelungenen Plugin!
Dein Plugin P1-Decryper (in Version 1.2.0) funktioniert bei mir zwar NICHT, aber ich würde dich sehr gerne unterstützen, wenn du es für Netz NÖ erweitern willst.
Für alle Mitlesenden: Version 1.2.0 dieses Plugins (unter Loxberry 3.0.0) scheint für Smartmeter von Netz NÖ derzeit nicht zu funktionieren, weil jeder Netzanbieter für die P1-Schnittstelle ein eigene Protokoll-Spezifikation zu benutzen scheint und dein Skript derzeit vermutlich leider nur Netz OÖ unterstützt. Bei mir (Netz NÖ, Drehstrom-Zähler Kaifa MA309M) läuft derzeit jedoch das Skript von Michael Reitbauer aka greenMikeEU (oben bereits mehrfach erwähnt) am Loxberry, und zwar in einer von mir modifizierten Version, die sich mit den Startbytes 68 FA FA 68 synchronisiert (und das Stopp-Byte 16 prüft) (meine Quelle dafür war die sehr knapp gehaltene "Publikums-Info" von Netz NÖ). Als Hardware zum Auslesen benutze ich übrigens M-Bus Master Hat DS von packom.net (weil mir ein HAT wegen seiner Stabilität lieber ist als eine über USB gesteckte Karte) auf einem Raspberry Pi 3 Model B V 1.2.
Angebot an Metrophos: Ich habe dein Python-Skript gelesen und könnte versuchen es möglichst kompakt so zu modifizieren, dass es meinen Netzbetreiber unterstützt, bin aber selbst Einsteiger in Python, habe aber Kenntnisse in anderen Programmiersprachen; die Entschlüsselung und Umwandlung der Daten in ein XML-Dokument erledigt bei mir wie im Skript von Michael Reitbauer übrigens das Package gurux_dlms.GXDLMSTranslator, vielleicht geht das auch mit Cryptodome.Cipher wie bei dir. Das Protokoll kenne ich nur aus der sehr knappen Publikums-Info meines Netzbetreibers und könnte es daher nicht so detailliert zergliedern wie du das in deinem Skript machst (das wäre meines Erachtens aber auch gar nicht erforderlich). Außerdem könnte ich für dich Tests des Plugins auf meinem Loxberry laufen lassen, und ich könnte entschlüsselte Protokoll-Pakete zur Verfügung stellen.Zuletzt geändert von oma-frieda; 12.01.2024, 00:47.Kommentar
-
Noschvie: Danke für die Rückmeldung dazu. Ich muss aber sagen, dass die beiden Software-Produkte Skript von greenMikeEU und Loxberry-Plugin von Metrophos bei aller Anerkennung der großartigen Pionier-Leistung von greenMikeEU, für die ich ebenfalls swehr dankbar bin, aus meiner Sicht schon eine sehr unterschiedliche Durchdringung der Struktur Daten-Pakete erkennen lassen (die öffenttlich zugänglichen, leicht erschließbaren Quellen dazu sind eher knapp und rar). Ich hoffe daher, Metrophos noch unterstützen zu können, dass beide Varianten (für Energie Steiermark und Netz NÖ) unter einen Hut zu bringen sind, sodass er sein Plugin aufwärtskompatibel in der bisherigen Qualität anbieten kann.
Netz NÖ (vulgo "EVN") dokumentiert: Kommunikations-Protokoll DLMS/COSEM unter Verwendung folgender Standards:
• DLMS/COSEM Architecture and Protocolls – Green Book Edition 9 oder höher
• DLMS/COSEM Interface Classes and OBIS Object Identification System – Book Edition 14 oder höher
DLMS-Sicherheitslevel: DLMS Security Suite 0 [d.h. alle Daten sind symmetrisch verschlüsselt], HLS5; zur Entschlüsselung der Daten wird ein GUEK (Global Unicast Encryption Key) benötigt.
Im dokumentierten Beispiel sind die Längen von GUEK: 16 Bytes; verschlüsselte APDU (Application Protokol Data Unit): 282 (= 256 + 26) Bytes; entschlüsselte APDU (Application Protocol Data Unit): 243 Bytes (verschlüsselt: 228 + 15 = 243).
Die Dokumentation der verschlüsselten APDUs der Kundenschnittstelle durch Netz NÖ ist meines Erachtens schlampig. Empirisch zergliedert sich die verschlüsselte APDU in zwei aufeinander folgende Daten-Pakete:
Code:[B]Daten-Paket 1/2 (256 Bytes):[/B] 4 Byte(s) m-bus start: 0x68FAFA68 [Hinweis: Byte #2 = Byte #3 gibt die Länge dieses Daten-Pakets an abzüglich 6 Bytes: 0xFA = 250, somit: 256 Bytes] 2 Byte(s) ?: 0x53FF 1 Byte(s) CI field: 0x00 [Anmerkung siehe unten] 2 Byte(s) ?: 0x0167 1 Byte(s) ?: 0xDB 1 Byte(s) system title length: 0x08 8 Byte(s) system title: 0x4B464D6750000009 2 Byte(s) length: 0x81F8 [Längen-Feld der "Applikations-Schicht": 0xF8 = 248 Bytes, davon 5 für Steuerung, somit 243 Bytes] 1 Byte(s) security control byte: 0x20 4 Byte(s) frame counter: 0x00000023 (wird von APDU zu APDU hochgezählt) 228 Byte(s) (encrypted) data part #1/2 (unterscheidet sich von APDU zu APDU): 0x88D5AB4F97515AAFC6B88D2F85DAA7A0E3C0C40D004535C397 C9D037AB7DBDA329107615444894A1A0DD7E85F02D496CECD3 FF46AF5FB3C9229CFE8F3EE4606AB2E1F409F36AAD2E50900A 4396FC6C2E083F373233A69616950758BFC7D63A9E9B6E99E2 1B2CBC2B934772CA51FD4D69830711CAB1F8CFF25F0A329337 CBA51904F0CAED88D61968743C8454BA922EB00038182C22FE 316D16F2A9F544D6F75D51A4E92A1C4EF8AB19A2B7FEAA32D0 726C0ED80229AE6C0F7621A4209251ACE2B2BC66FF0327A653 BB686C756BE033C7A281F1D2A7E1FA31C3983E15F8FD16CC57 87E6F5 1 Byte(s) m-bus checksum: 0x17 (abhängig von "(encrypted) data part #1/2") 1 Byte(s) m-bus stop: 0x16 [B]Daten-Paket 2/2 (26 Bytes):[/B] 4 Byte(s) m-bus start: 0x68141468 [Hinweis: Byte #2 = Byte #3 gibt die Länge dieses Daten-Pakets an abzüglich 6 Bytes: 0x14 = 20, somit: 26 Bytes] 2 Byte(s) ?: 0x53FF 1 Byte(s) CI field: 0x11 [Anmerkung siehe unten] 2 Byte(s) ?: 0x0167 15 Byte(s) (encrypted) data part #2/2 (unterscheidet sich von APDU zu APDU): 0x419A3CFDA44BE438C96F0E38BF83D9 1 Byte(s) m-bus checksum: 0x83 (abhängig von "(encrypted) data part #2/2") 1 Byte(s) m-bus stop: 0x16 Anmerkung zu Werten 0x00 bis 0x1F im "CI field": - sofern die gesamten Daten in einem Paket gesendet werden: Wert 0x10. - sofern die gesamten Daten in mehreren Paketen gesendet werden: Wert 0x00 für erstes Paket, Werte 0x01 .. 0x0F für folgende Pakete, Wert aus 0x10 bis 0x1F für letzes Paket, wobei die letzten vier Bit als Laufnummer über alle Pakete (vom ersten bis zum letzen, beginnend mit 0) benutzt werden. Somit wäre der Wert 0x10 (theoretisch) mehrdeutig: Es könnte sich um eine vollständige Datensendung handeln oder um das letzte Paket einer Serie von zusammengehörigen Daten-Paketen, im zweiten Fall müssten nach meiner Interpretation aber 16, 32, 48, ... Datenpakete vorangegangen sein, was mir bei bei Smartmetern eher unwahrscheinlich erscheint. Die [B]entschlüsselte APDU[/B] mit 243 Bytes (verschlüsselt: 243 = 228 + 15 Bytes) kann wie folgt zerlegt werden: 0f8006870e # 0c07e5091b01092f0f00ff8880 # [][2021-09-27 T 09:47:15 -02:00][] 0223090c07e5091b01092f0f00ff8880 # [][2021-09-27 T 09:47:15 -02:00][] 09060100010800ff060000328902020f00161e # [1-0:1.8.0*255 = WirkEnergieTotalImport][12937][Wh] 09060100020800ff060000000002020f00161e # [1-0:2.8.0*255 = WirkEnergieTotalExport][0][Wh] 09060100010700ff060000000002020f00161b # [1-0:1.7.0*255 = WirkLeistungAktuellImport][0][W] 09060100020700ff060000000002020f00161b # [1-0:2.7.0*255 = WirkLeistungAktuellExport][0][W] 09060100200700ff12092102020fff1623 # [1-0:32.7.0*255 = SpannungL1Aktuell][233.7][V] 09060100340700ff12000002020fff1623 # [1-0:52.7.0*255 = SpannungL2Aktuell][0.0][V] 09060100480700ff12000002020fff1623 # [1-0:72.7.0*255 = SpannungL3Aktuell][0.0][V] 090601001f0700ff12000002020ffe1621 # [1-0:31.7.0*255 = StromL1Aktuell][0.0][A] 09060100330700ff12000002020ffe1621 # [1-0:51.7.0*255 = StromL2Aktuell][0.0][A] 09060100470700ff12000002020ffe1621 # [1-0:71.7.0*255 = StromL3Aktuell][0.0][A] 090601000d0700ff1203e802020ffd16ff # [1-0:13.7.0*255 = LeistungsFaktorAktuell][1.0][] 090c313831323230303030303039 # [][181220000009][]
Ich habe es nun geschafft, für Netz NÖ das Paket gurux_dlms.GXDLMSTranslator durch das Paket Cryptodome.Cipher zu ersetzen; man kann damit zum gleichen entschlüsselten Datenpaket kommen (und zwar mit den gleichen Parametern und im Modus AES-GCM):
Code:#!/usr/bin/python3 import binascii from Cryptodome.Cipher import AES AAD = '3000112233445566778899AABBCCDDEEFF' # AAD: Additional Authenticated Data for AES-GCM EVNDEMO_GUEK = '36C66639E48A8CA4D6BC8B282A793BBB' # key for decryption of meter data EVNDEMO_APDU_encr = '68FAFA6853FF000167DB084B464D675000000981F8200000002388D5AB4F97515AAFC6B88D2F85DAA7A0E3C0C40D004535C397C9D037AB7DBDA329107615444894A1A0DD7E85F02D496CECD3FF46AF5FB3C9229CFE8F3EE4606AB2E1F409F36AAD2E50900A4396FC6C2E083F373233A69616950758BFC7D63A9E9B6E99E21B2CBC2B934772CA51FD4D69830711CAB1F8CFF25F0A329337CBA51904F0CAED88D61968743C8454BA922EB00038182C22FE316D16F2A9F544D6F75D51A4E92A1C4EF8AB19A2B7FEAA32D0726C0ED80229AE6C0F7621A4209251ACE2B2BC66FF0327A653BB686C756BE033C7A281F1D2A7E1FA31C3983E15F8FD16CC5787E6F517166814146853FF110167419A3CFDA44BE438C96F0E38BF83D98316' EVNDEMO_APDU_decr = '0F8006870E0C07E5091B01092F0F00FF88800223090C07E5091B01092F0F00FF888009060100010800FF060000328902020F00161E09060100020800FF060000000002020F00161E09060100010700FF060000000002020F00161B09060100020700FF060000000002020F00161B09060100200700FF12092102020FFF162309060100340700FF12000002020FFF162309060100480700FF12000002020FFF1623090601001F0700FF12000002020FFE162109060100330700FF12000002020FFE162109060100470700FF12000002020FFE1621090601000D0700FF1203E802020FFD16FF090C313831323230303030303039' GUEK, APDU_encr, APDU_decr = EVNDEMO_GUEK, EVNDEMO_APDU_encr, EVNDEMO_APDU_decr # GUEK, APDU_encr, APDU_decr = MY_GUEK, MY_APDU_encr, MY_APDU_decr dataunit_system_title = APDU_encr[22 : 22 + 16] # print('data unit - system title: ' + dataunit_system_title) dataunit_frame_counter = APDU_encr[44 : 44 + 8] # print('data unit - frame counter: ' + dataunit_frame_counter) dataunit_data_encrypted = APDU_encr[52 : 512 - 4] + APDU_encr[512 + 18 : -4]; # print('data unit - data (encrypted): ' + dataunit_data_encrypted) meter_decr_iv = dataunit_system_title + dataunit_frame_counter # IV: initialization vector for AES-GCM cipher = AES.new( binascii.unhexlify(GUEK) , AES.MODE_GCM , binascii.unhexlify(meter_decr_iv) , mac_len = 12 ) cipher.update(binascii.unhexlify(AAD)) dataunit_data_decrypted = cipher.decrypt(binascii.unhexlify(dataunit_data_encrypted)).hex() print('data unit - decrypted original: ', APDU_decr) print('data unit - self-decrypted: ', dataunit_data_decrypted.upper()) print() cipher = AES.new( binascii.unhexlify(GUEK) , AES.MODE_GCM , binascii.unhexlify(meter_decr_iv) , mac_len = 12 ) cipher.update(binascii.unhexlify(AAD)) dataunit_data_decrypted = cipher.decrypt(binascii.unhexlify(dataunit_data_encrypted)).hex() print('data unit - decrypted original: ', APDU_decr) print('data unit - self-decrypted: ', dataunit_data_decrypted.upper()) print() cipher = AES.new( binascii.unhexlify(GUEK) , AES.MODE_GCM , binascii.unhexlify(meter_decr_iv) , mac_len = 12 ) cipher.update(binascii.unhexlify(AAD)) ciphertext, tag = cipher.encrypt_and_digest(binascii.unhexlify(APDU_decr)) print('data unit - encrypted original: ', APDU_encr) print('data unit - encr extr from original: ', dataunit_data_encrypted) print('data unit - self-encrypted data: ', str(ciphertext.hex()).upper()) print('data unit - self-encrypted tag: ', str(tag.hex()).upper())
Zuletzt geändert von oma-frieda; 02.02.2024, 17:50.Kommentar
-
Vorarlberg Netz: Erkenntnisse zu deren Kunden-Schnittstelle im Vergleich zu Netz NÖ (vulgo EVN) nach einem ersten Blick in deren Doku und empirischer Analyse eines mitgeschnittenen Datenstroms:
Die physikalische Schnittstelle scheint übereinzustimmen mit jener von Netz NÖ, wird zwar H1 (statt P1) genannt, ist aber gleichfalls eine eine verdrahtete M-Bus-Schnittstelle (gemäß EN 13757-2) und nutzt ebenfalls als Stecker "RJ12 Modular Jack 6P6C connector" mit der gleichen Belegung 1=NC, 2=NC, 3=MBUS1(+), 4=MBUS2(-), 5=NC, 6=NC und die gleiche feste Baudrate von 2400 Baud.
Die verschlüsselte APDU scheint 376 = 256 + 120 (statt 282 = 256 + 26) Bytes lang zu sein und sich ebenfalls in zwei aufeinander folgende Daten-Pakete aufzugliedern, die auch jeweils ähnlich aufgebaut scheinen wie jene von Netz NÖ:
Beim ersten Datenpaket wurden folgende Abweichungen im Vergleich zu Netz NÖ festgestellt:
8 Byte(s) system title: 0x4B464D102002385E (statt 0x4B464D6750000009)
3 Byte(s) length: 0x820155 (statt 0x81F8) [Längen-Feld der "Applikations-Schicht": 0x0155 = 341 Bytes, davon 5 für Steuerung, somit 336 Bytes]
1 Byte(s) security control byte: 0x21 (statt 0x20)
und beim zweiten Datenpaket:
Länge von 120 (statt 26) Bytes und Länge der darin enthaltenen verschlüsselten Daten: 109 (statt 15) Bytes
Startbyte-Folge: 0x68727268 (statt 0x68141468 bei Netz NÖ) [Hinweis: Byte #2 = Byte #3 gibt die Länge dieses Daten-Pakets an abzüglich 6 Bytes: 0x72 = 114, somit: 120 Bytes]
Die entschlüsselte APDU mit 336 Bytes (verschlüsselt: 336 = 227 + 109 (statt 243 = 228 + 15 bei Netz NÖ) Bytes) kann wie folgt zerlegt werden:
0f0032e1d2 #
0c07e8011b060a041e00ffc400 # [][2024-01-27 T 10:04:30 -01:00][]
021009060000010000ff090c07e8011b060a041e00ffc400 # [0-0:1.0.0*255 = ZeitStempel][2024-01-27 T 10:04:30 -01:00][]
020209060000600100ff090e31************************ 32 # [0-0:96.1.0*255 = ZaehlerNummer][1************2][]
0202090600002a0000ff09104b************************ ****32 # [0-0:42.0.0*255 = ZaehlerNameCOSEM][K**************2][]
020309060100200700ff12090002020fff1623 # [1-0:32.7.0*255 = SpannungL1Aktuell][230.4][V]
020309060100340700ff12090902020fff1623 # [1-0:52.7.0*255 = SpannungL2Aktuell][231.3][V]
020309060100480700ff1208fb02020fff1623 # [1-0:72.7.0*255 = SpannungL3Aktuell][229.9][V]
0203090601001f0700ff12007102020ffe1621 # [1-0:31.7.0*255 = StromL1Aktuell][1.13][A]
020309060100330700ff12007502020ffe1621 # [1-0:51.7.0*255 = StromL2Aktuell][1.17][A]
020309060100470700ff1201f202020ffe1621 # [1-0:71.7.0*255 = StromL3Aktuell][4.98][A]
020309060100010700ff060000031202020f00161b # [1-0:1.7.0*255 = WirkLeistungAktuellImport][786][W]
020309060100020700ff060000000002020f00161b # [1-0:2.7.0*255 = WirkLeistungAktuellExport][0][W]
020309060100010800ff0600ae1fc502020f00161e # [1-0:1.8.0*255 = WirkEnergieTotalImport][11411397][Wh]
020309060100020800ff060043f46302020f00161e # [1-0:2.8.0*255 = WirkEnergieTotalExport][4453475][Wh]
020309060100030800ff06001e08fe02020f001620 # [1-0:3.8.0*255 = BlindEnergieTotalImport][1968382][varh]
020309060100040800ff060054735c02020f001620 # [1-0:4.8.0*255 = BlindEnergieTotalExport][5534556][varh]
Zuletzt geändert von oma-frieda; 02.02.2024, 17:52. -
Meine empirischen Erkenntnisse zu Smartmetern der Energie-Netze Steiermark:
Es scheint so zu sein, dass über Port P1 bei einer Baudrate von 115200 alle 10 Sekunden ein Datensatz geschickt wird, der jeweils 511 Bytes lang ist (und in den ersten 14 bis max. 17 Positionen in den Byte-Werten mit anderen Datensätzen übereinstimmen kann; ansonsten gibt es allenfalls zufällige Übereinstimmungen von Bytes an gleichen Positionen):
Aufbau der verschlüsselten Datensätze (jeweils 511 Bytes lang):
0xDB :: 1 Byte(s) ? (von mir interpretiert als "Start"-Byte von Application Layer)
0x08 :: 1 Byte(s) system title length: 0x08 -> "8 Bytes langer system title"
0xXXXXXXXXXXXXXXXX :: 8 Byte(s) system title
0x8201F2 :: 3 Byte(s) length - Längen-Feld der "Applikations-Schicht": 0x01F2 = 498 Bytes (passt zu Gesamt-Länge!), davon 5 für Steuerung und 12 Bytes für GCM_TAG, somit verbleiben 481 für Payload
0x30 :: 1 Byte(s) security control byte: 0x30 = Bit 4 (Wert: 0x10): “A” subfield: indicates that authentication is applied + Bit 5 (Wert: 0x20): “E” subfield: indicates that encryption is applied.
0xXXXXXXXX :: 4 Byte(s) frame counter (wird fortlaufend um 1 erhöht)
481 Bytes Payload (quasi zufällig)
12 Bytes GCM_TAG (quasi zufällig)
entschlüsselter Datensatz (Achtung, es wurden etliche Bytes verfälscht):
/EST5\\453749974_A\r\n
\r\n
1-3:0.2.8(50)\r\n
0-0:1.0.0(240224114218W)\r\n
1-0:1.8.0(012210781*Wh)\r\n
1-0:1.8.1(007965019*Wh)\r\n
1-0:1.8.2(004245762*Wh)\r\n
1-0:1.7.0(000000000*W)\r\n
1-0:2.8.0(009626500*Wh)\r\n
1-0:2.8.1(009126428*Wh)\r\n
1-0:2.8.2(000500072*Wh)\r\n
1-0:2.7.0(000007716*W)\r\n
1-0:3.8.0(000032521*varh)\r\n
1-0:3.8.1(000030749*varh)\r\n
1-0:3.8.2(000001772*varh)\r\n
1-0:3.7.0(000000000*var)\r\n
1-0:4.8.0(012980729*varh)\r\n
1-0:4.8.1(009213783*varh)\r\n
1-0:4.8.2(003766946*varh)\r\n
1-0:4.7.0(000000355*var)\r\n
!RQ47r\n
Hinweis: speziell !RQ47 ändert sich anscheinend von Telegramm zu Telegramm (wobei das Rufzeichen ! bestehen bleibt); es könnte sich um eine Prüfsumme handeln; aber Achtung: Dieser und andere Werte hier wurden verfälscht.Zuletzt geändert von oma-frieda; 02.04.2024, 00:56.
-
Kommentar