Public Key Signature

Die smart-me Zähler (Ab Version 2.0) signieren alle Messdaten und Transaktionen digital. Damit ist es jederzeit möglich die Echtheit von Messwerten zu überprüfen. smart-me nutzt dazu das kryptografische Prinzip einer Ende-zu-Ende-Sicherung mittels einer digitalen Signatur auf Basis asymmetrischer Verschlüsselung.

smart-me unterscheidet zwischen zwei Arten von signierten Messwerten:

  • Signed meter values: Signierte Messwerte, welche alle 15 Minuten gespeichert und signiert werden. Ideal für die Abrechnung des Energieverbrauchs.
  • Signed transaction: Signierte Transaktionen sind für Energieverbräuche in einem bestimmten Zeitraum (z.B. Laden von E-Fahrzeugen) gedacht. Sie haben immer einen Anfangs- und Endwert.

Technologie / Ablauf

Signatur Algorithmus: ECDSA 256 Bit NIST curve (SECP256R1)

Hash Algorithmus: SHA256

Ablauf (zertifizierte) Produktion

In der Produktion des Zählers wird ein asymmetrisches Schlüsselpaar generiert und auf dem Zähler gespeichert. Der öffentliche Schlüssel (Public Key) wird zudem öffentlich verfügbar in der Cloud gespeichert.

Ablauf Signierung Messwerte

  • Alle 15min oder beim Beenden einer Transaktion, wird ein Datenpaket mit den entsprechenden Messwerten gebildet.
  • Über diese Daten wird ein Hash (SHA256) gebildet.
  • Dieser Hash wird verschlüsselt (ECDSA 256) und als Signatur gespeichert.
  • Das Datenpaket wird zusammen mit der Signatur an die Cloud gesendet und gespeichert.

Ablauf Überprüfung Messwerte

  • Der Kunde erhält über die App, das Web oder eine Drittpartei das Datenpaket mit den Messdaten.
  • Bildung des Hash (SHA256) über das Datenpaket.
  • Der Public Key ist für alle smart-me Zähler öffentlich in der Cloud (auch über API) verfügbar
  • Der Kunde verifiziert den Hash des Datenpakets mit dem öffentlichen Schlüssel.

Datenpakete

Um die Grösse des Datenpakets und die DAMIT benötigte Datenmenge für die Übertragung so klein wie möglich zu halten, verwendet smart-me für die Messwerte "Google Protocol Buffers" als Datenformat. Die Datenpakete sind wie folgt aufgebaut:

Signed meter values

message CounterValue {
  optional bytes Obis = 1;
  optional int64 Value = 2;
  optional string Unit = 3;
}

message MeasurementValues
{
 optional uint32 SerialNumber = 1;
 optional uint32 TimestampUtc = 2;
 repeated CounterValue Values = 3;
}

Measurement values

SerialNumber: Die Seriennummer des Zählers (z.B. 6300000)

TimestampUtc: Unix Time Stamp (UTC) von diesen Messdaten

Values: Liste mit allen Messwerten (CounterValue) in diesem Datenpaket.

CounterValue

Obis: OBIS code des Messwertes (6 bytes). z.B.

{ 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF } für 1-0:1.8.1*255 (Wirkenergie Bezug Tarif 1)

Value: Der Messwert

Unit: Die Einheit des Messwertes. Bei smart-me meist mWh (Miliwattstunden)

Signed transactions

Transaktionen bestehen aus einem Startwert und einem Endwert.

message CounterValue {
  optional bytes Obis = 1;
  optional int64 Value = 2;
  optional string Unit = 3;
}

message MeasurementValues
{
 optional uint32 SerialNumber = 1;
 optional uint32 TimestampUtc = 2;
 repeated CounterValue Values = 3;
}


message Transaction
{
 optional uint32 SerialNumber = 1;
 optional uint32 TransactionNumber = 2;
 optional int64 UserId = 3;
 optional MeasurementValues StartValues = 4;
 optional MeasurementValues EndValues = 5;
}

Transaction

SerialNumber: Die Seriennummer des Zählers (z.B. 6300000)

TransactionNumber: Die Nummer der Transaktion. Diese Nummer zählt bei jeder Transaktion hoch.

UserId: Die ID des Benutzer welche diese Transaktion gestartet hat.

StartValues: Die Messwerte bei Beginn der Transaktion (siehe oben)

EndValues: Die Messwerte beim Ende der Transaktion (siehe oben)

Beispiel

Dieses Bespiel zeigt die Validierung einer signierten Transaktion.

Datenpaket (Transaktion)

awicMRCF/v//DyIvEOrEhuYFGhMKBgEAAQgA/xCj/MaiDhoDbVdoGhIKBgEAAggA/xCkiPkCGgNtV2gqLxDQyIbmBRoTCgYBAAEIAP8Qq7v9ow4aA21XaBoSCgYBAAIIAP8QpIj5AhoDbVdo

oder HEX:

6b 08 9c 31 10 85 fe ff ff 0f 22 2f 10 ea c4 86 e6 05 1a 13 0a 06 01 00 01 08 00 ff 10 a3 fc c6 a2 0e 1a 03 6d 57 68 1a 12 0a 06 01 00 02 08 00 ff 10 a4 88 f9 02 1a 03 6d 57 68 2a 2f 10 d0 c8 86 e6 05 1a 13 0a 06 01 00 01 08 00 ff 10 ab bb fd a3 0e 1a 03 6d 57 68 1a 12 0a 06 01 00 02 08 00 ff 10 a4 88 f9 02 1a 03 6d 57 68

Signatur

V0EGJ3gHNbnUZ8hAfdRn2ziEVbnXpZ3a5L5WtG24XOWOeCBKH687W/wikxqK5e+Zad3R/PuCnQDNqgeSfh4pow==

oder HEX:

57 41 06 27 78 07 35 b9 d4 67 c8 40 7d d4 67 db 38 84 55 b9 d7 a5 9d da e4 be 56 b4 6d b8 5c e5 8e 78 20 4a 1f af 3b 5b fc 22 93 1a 8a e5 ef 99 69 dd d1 fc fb 82 9d 00 cd aa 07 92 7e 1e 29 a3

Public Key

RUNTMSAAAAAN48gSNbwl1Uj4DDvwO1wReZj95r19F5nqvy8pTmoUtyMBtf2HgwN6jf9+Akzp/nsy+BMrzAdvrjOD5wfYDGVk

oder HEX:

45 43 53 31 20 00 00 00 0d e3 c8 12 35 bc 25 d5 48 f8 0c 3b f0 3b 5c 11 79 98 fd e6 bd 7d 17 99 ea bf 2f 29 4e 6a 14 b7 23 01 b5 fd 87 83 03 7a 8d ff 7e 02 4c e9 fe 7b 32 f8 13 2b cc 07 6f ae 33 83 e7 07 d8 0c 65 64

Hash (SHA256) des Datenpakets berechnen:

SHA256(Datenpaket) = 52 2F 46 C6 26 70 17 32 B6 FD 4B 78 7E 31 5D 3B EE F0 F4 E3 42 66 4A D0 5F AB 95 74 F1 C1 3C 0C

Hash mit dem Public Key mittels ECDSA 256 validieren

OK

Datenpaket deserialisieren Das Datenpaket kann, zusammen mit der Protobuffer Definition, einfach deserialisiert werden (Beispiel visualisiert als JSON):

{  
   "SerialNumber":6300,
   "TransactionNumber":4294967045,
   "UserId":0,
   "StartValues":{  
      "SerialNumber":null,
      "TimeStampUtc":1556193898,
      "CounterValues":[  
         {  
            "Obis":"AQABCAD/",
            "Value":3830562339,
            "Unit":"mWh"
         },
         {  
            "Obis":"AQACCAD/",
            "Value":6177828,
            "Unit":"mWh"
         }
      ]
   },
   "EndValues":{  
      "SerialNumber":null,
      "TimeStampUtc":1556194384,
      "CounterValues":[  
         {  
            "Obis":"AQABCAD/",
            "Value":3833552299,
            "Unit":"mWh"
         },
         {  
            "Obis":"AQACCAD/",
            "Value":6177828,
            "Unit":"mWh"
         }
      ]
   }
}


Lesehilfe

StartValues

TimeStampUtc 1556194384 = 25.04.2019 12:04 (UTC)

Messwert 1 Obis: AQABCAD/ = 01 00 01 08 00 ff = 1-0:1.8.0*255 (Wirkenergie Bezug Total)

Messwert 1: Wert 3830562339 mWh = 3830.562 kWh

Messwert 2 Obis: AQACCAD/ = 01 00 02 08 00 ff = 1-0:2.8.0*255 (Wirkenergie Lieferung Total)

Messwert 2: Wert 6177828 mWh = 6.177 kWh


EndValues

TimeStampUtc 1556194384 = 25.04.2019 12:13 (UTC)

Messwert 1 Obis: AQABCAD/ = 01 00 01 08 00 ff = 1-0:1.8.0*255 (Wirkenergie Bezug Total)

Messwert 1: Wert 3833552299 mWh = 3833.552 kWh

Messwert 2 Obis: AQACCAD/ = 01 00 02 08 00 ff = 1-0:2.8.0*255 (Wirkenergie Lieferung Total)

Messwert 2: Wert 6177828 mWh = 6.177 kWh


-> Energieverbrauch in dieser Transaktion: 3833.552 kWh - 3830.562 kWh = 2.99 kWh