Passa al contenuto principale

Public Key Signature

I contatori smart-me (a partire dalla versione 2.0) firmano digitalmente tutti i dati di misura e le transazioni. In questo modo è possibile verificare in qualsiasi momento l'autenticità dei valori misurati. A tale scopo smart-me utilizza il principio crittografico di una protezione end-to-end mediante una firma digitale basata sulla crittografia asimmetrica.

smart-me distingue tra due tipi di valori di misura firmati:

  • Signed meter values: valori di misura firmati, che vengono salvati e firmati ogni 15 minuti. Ideali per il conteggio del consumo di energia.

  • Signed transaction: le transazioni firmate sono pensate per i consumi di energia in un determinato periodo (ad es. la ricarica di veicoli elettrici). Hanno sempre un valore iniziale e un valore finale.

Tecnologia / Procedura​

Algoritmo di firma: ECDSA 256 Bit NIST curve (SECP256R1)

Algoritmo di hash: SHA256

Procedura: produzione (certificata)​

Durante la produzione del contatore viene generata una coppia di chiavi asimmetriche, che viene salvata sul contatore. La chiave pubblica (Public Key) viene inoltre salvata nel cloud, dove è accessibile pubblicamente.

Procedura: firma dei valori di misura​

  • Ogni 15 minuti o al termine di una transazione viene creato un pacchetto di dati con i relativi valori di misura.

  • Su questi dati viene calcolato un hash (SHA256).

  • Questo hash viene cifrato (ECDSA 256) e salvato come firma.

  • Il pacchetto di dati viene inviato al cloud insieme alla firma e lì salvato.

Procedura: verifica dei valori di misura​

  • Il cliente riceve il pacchetto con i dati di misura tramite l'app, il web o una terza parte.

  • Calcolo dell'hash (SHA256) sul pacchetto di dati.

  • La Public Key di tutti i contatori smart-me è disponibile pubblicamente nel cloud (anche tramite API)

  • Il cliente verifica l'hash del pacchetto di dati con la chiave pubblica.

Pacchetti di dati​

Per mantenere il più ridotte possibile le dimensioni del pacchetto di dati e quindi la quantità di dati necessaria per la trasmissione, smart-me utilizza "Google Protocol Buffers" come formato dei dati per i valori di misura. I pacchetti di dati sono strutturati come segue:

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: il numero di serie del contatore (ad es. 6300000) TimestampUtc: Unix Time Stamp (UTC) di questi dati di misura Values: elenco di tutti i valori di misura (CounterValue) contenuti in questo pacchetto di dati.

CounterValue

Obis: codice OBIS del valore di misura (6 bytes). Ad es. { 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF } per 1-0:1.8.1*255 (energia attiva prelievo tariffa 1) Value: il valore di misura Unit: l'unità del valore di misura. Per smart-me di solito mWh (milliwattora)

Transazioni firmate​

Le transazioni sono composte da un valore iniziale e da un valore finale.

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;
}

Transazione SerialNumber: il numero di serie del contatore (ad es. 6300000) TransactionNumber: il numero della transazione. Questo numero aumenta a ogni transazione. UserId: l'ID dell'utente che ha avviato questa transazione. StartValues: i valori di misura all'inizio della transazione (vedi sopra) EndValues: i valori di misura alla fine della transazione (vedi sopra)

Esempio​

Questo esempio mostra la validazione di una transazione firmata.

Pacchetto di dati (transazione)

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

Firma

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

Calcolare l'hash (SHA256) del pacchetto di dati:

SHA256(pacchetto di dati) = 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

Validare l'hash con la Public Key mediante ECDSA 256

OK

Deserializzare il pacchetto di dati: insieme alla definizione Protobuffer, il pacchetto di dati può essere deserializzato facilmente (esempio visualizzato come 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"
}
]
}
}

Guida alla lettura

StartValues

TimeStampUtc 1556194384 = 25.04.2019 12:04 (UTC)

Valore di misura 1 Obis: AQABCAD/ = 01 00 01 08 00 ff = 1-0:1.8.0*255 (energia attiva prelievo totale)

Valore di misura 1: valore 3830562339 mWh = 3830.562 kWh

Valore di misura 2 Obis: AQACCAD/ = 01 00 02 08 00 ff = 1-0:2.8.0*255 (energia attiva immissione totale)

Valore di misura 2: valore 6177828 mWh = 6.177 kWh

EndValues

TimeStampUtc 1556194384 = 25.04.2019 12:13 (UTC)

Valore di misura 1 Obis: AQABCAD/ = 01 00 01 08 00 ff = 1-0:1.8.0*255 (energia attiva prelievo totale)

Valore di misura 1: valore 3833552299 mWh = 3833.552 kWh

Valore di misura 2 Obis: AQACCAD/ = 01 00 02 08 00 ff = 1-0:2.8.0*255 (energia attiva immissione totale)

Valore di misura 2: valore 6177828 mWh = 6.177 kWh

-> Consumo di energia in questa transazione: 3833.552 kWh - 3830.562 kWh = 2.99 kWh