Hallo Steffel, hier habe ich meine python3 Umsetzung zum Lesen der Kaifa Kundenschnittstelle mittels Raspberry Pi 3 veröffentlicht.
Beiträge von micronano
-
-
-
Verwendete Tools am Raspberry Pi
Terminalprogramme:
minicom
sudo apt-get install minicom
gtkterm
sudo apt-get install gtkterm
HexEditor
bless
sudo apt-get install bless
Python IDE
Thonny
war bei mir schon drauf
-
Kundenschnittstelle Kaifa MA309 auslesen
Für die Entschlüsselung benötigt man:
key … erhält man vom Netzbetreiber per Post (16 Bytes lang)
IV … aus dem Header zusammensetzen (12 Bytes lang)
Daten … Telegramm1 und Telegramm2 aus dem Datenpaket zusammensetzen
Datenpaket für die Decryption vorbereiten:
Ein 5 Sekunden Datensatz setzt sich wie folgt zusammen:
Telegramm 1 beginnt mit 68 FA FA 68 (Länge 27 Byte)
00000000h: 68 FA FA 68 53 FF 00 01 67 DB 08 4B 46 4D 10 10 ; húúhSÿ..gÛ.KFM..
00000010h: 00 00 23 82 01 09 21 00 29 5B 9A EF C1 54 6E 64 ; ..#‚..!.)[šïÁTnd
....................
....................
....................
000000f0h: 07 FB 4C 48 98 E7 64 E9 E3 A3 2D DC 3D 1F 0F 16 ; .ûLH˜çdéã£-Ü=...
Telegramm 2 beginnt ab Stelle 256 mit 68 26 26 68 (Länge 9 Byte)
00000100h: 68 26 26 68 53 FF 11 01 67 B4 69 61 CE 96 2B 2C ; h&&hSÿ..g´iaΖ+,
00000110h: 78 05 0C 96 59 8C 7E 4D 26 65 80 43 F9 CB CA 78 ; x..–YŒ~M&e€CùËÊx
00000120h: 18 9B D0 1B 13 9F 8A E0 F7 39 11 16 ; .›Ð..ŸŠà÷9..
Beide Telegramme enden jeweils mit einem checksum Byte gefolgt von 16.
Jedes Telegramm enthält eine „encrypted payload“. Beide Payloads ausschneiden und zusammenfügen.
Diese Paket wird mit dem KEY und dem IV in die Decryption geschickt.
IV (InitialisierungsVektor) zusammensetzen
Dazu benötigen wir den SysTitle und den IC.
SysTitle: beginnt bei 12 und ist 8 Byte lang (im Header von Telegramm1)
00000000h: 68 FA FA 68 53 FF 00 01 67 DB 08 4B 46 4D 10 10 ; húúhSÿ..gÛ.KFM..
00000010h: 00 00 23 82 01 09 21 00 29 5B 9A EF C1 54 6E 64 ; ..#‚..!.)[šïÁTnd
IC: beginnt bei 24 und ist 4 Byte lang (im Header von Telegramm1)
00000000h: 68 FA FA 68 53 FF 00 01 67 DB 08 4B 46 4D 10 10 ; húúhSÿ..gÛ.KFM..
00000010h: 00 00 23 82 01 09 21 00 29 5B 9A EF C1 54 6E 64 ; ..#‚..!.)[šïÁTnd
IV: setzt sich zusammen aus SysTitle + IC und ist bei AES128-GCM Verschlüsselung 12Byte lang
4B 46 4D 10 10 00 00 23 00 29 5B 9A
Wenn man die benötigten Teile (encryptedData, key, iv) hat, dann kann man online die Dekodierung mit dem
CyberChef Tool vornehmen (für Testzwecke).
Recipe: AES Encrypt
Key: dein key
IV: dein iv
Mode: GCM
Input: HEX
Output: HEX
Input: dein zusammengesetztes payload Paket einfügen
Output: entschlüsseltes Ergebnis (OBIS Codes in HEX)
Link: CyberChef
Online Entschlüsselung mit dem Gurux Translator
Möchte man die Entschlüsselung mit dem Gurux Translator machen, dann müssen wir das Paket anders zusammensetzen.
00000000h: 68 FA FA 68 53 FF 00 01 67 DB 08 4B 46 4D 10 10 ; húúhSÿ..gÛ.KFM..
Hier müssen wir Telegramm 1 und 2 ab Byte 10 ausschneiden (wieder bis vor das checksum Byte und 16ner Byte)
Zusammengesetzter Block im Gurux Translator bei Messages einfügen.
Im Reiter "Ciphering":
Modus: Security Suite 0, encryption (only)
SystemTitle (hex): haben wir oben schon ermittelt
Block cipher key (hex): dein key
WiredMBus im DropDown auswählen.
Im Reiter "PDU" kann man sich "Pdu to XML" die Werte ausgeben lassen.
Decryption mit Python3
Für die Decryption habe ich pycryptodome verwendet.
pip3 install pycryptodome
Für die encrypted_payload, welche oben unter "Datenpaket für die Decryption vorbereiten" beschrieben wurde, habe ich die Variable cyphertext verwendet. Key und IV werden ebenfalls jetzt notwendig.
so beginnt das Python Prg -> für die Dekodierung notwendig: from Crypto.Cipher import AES
from os import system, name
import time
from time import sleep
import binascii
import datetime
import serial
from Crypto.Cipher import AES
.................
.................
.................
Diese 3 Zeilen entschlüsseln dann die Payload:
cyphertext_bytes = binascii.unhexlify(cyphertext.hex())
cipher = AES.new(key, AES.MODE_GCM, nonce=iv)
decrypted = cipher.decrypt(cyphertext_bytes)
print("\nDecrypted:")
print(decrypted.hex())
Die Variable decrypted enthält nun die entschlüsselte Payload und darin befinden sich die OBIS Codes und deren Werte.
Allerdings in HEX und die Werte muss man erst finden
Ich speichere mal zur Sicherheit bis hier ab, bevor noch meine ganzen Eingaben weg sind
-
Hi Hi
vielen Dank für deine rasche Antwort ... wollte grad den selben Link posten
soweit funktioniert das wie in dem Link beschrieben.
Ich starte den Gurux GXDLMSDirector, dann gehe ich auf Tools und wähle DLMS Translator.
Unter "#Example" kopiere ich meine empfangenen Daten hinein und klicke auf "Translate".
Schaut gut aus.
-
Ich habe mittlerweile gültige Frames auslesen können. Leider kann diese der Volkszähler noch nicht behandeln, jetzt schaut sich der Entwickler das an.
Hallo steffel,
ich habe das Gefühl du hast mit der Materie schon mehr gearbeitet, darf ich dir deshalb da ein paar Fragen stellen?
wie erkennt man gültige Frames (Kaifa Zähler)?
wie lang ist ein Frame?
kann das einer gültigen Start und Ende Sequenz entsprechen?
Start:
und das dem Ende und dem nächsten Block?
Ich habe die erhaltenen Daten abgespeichert und frage mich mit welchem Tool ich sie entschlüsseln kann.
wenn der Entschlüsselung erfolgt ist, wie gehts dann weiter?
-
Hallo Leute, bin auch eben in das Thema "Tinetz Smart Meter Zähler auslesen" eingestiegen.
Ich habe mir diesen M-Bus TTL USB Konverter nachgebaut (20€).
Hat ev. jemand von euch schon ein lauffähiges Python Programm für den Raspberry um die Daten an der M-Bus Schnittstelle auslesen und entschlüsseln zu können?