Aller au contenu principal

Public Key Signature

Les compteurs smart-me (à partir de la version 2.0) signent numériquement toutes les données de mesure et toutes les transactions. Il est ainsi possible de vérifier à tout moment l'authenticité des valeurs mesurées. smart-me utilise pour cela le principe cryptographique d'une sécurisation de bout en bout au moyen d'une signature numérique basée sur un chiffrement asymétrique.

smart-me distingue deux types de valeurs mesurées signées :

  • Signed meter values : valeurs mesurées signées, enregistrées et signées toutes les 15 minutes. Idéales pour le décompte de la consommation d'énergie.

  • Signed transaction : les transactions signées sont destinées aux consommations d'énergie sur une période donnée (p. ex. recharge de véhicules électriques). Elles ont toujours une valeur de début et une valeur de fin.

Technologie / déroulement​

Algorithme de signature : ECDSA 256 Bit NIST curve (SECP256R1)

Algorithme de hachage : SHA256

Déroulement : production (certifiée)​

Lors de la production du compteur, une paire de clés asymétriques est générée et enregistrée sur le compteur. La clé publique (Public Key) est en outre enregistrée dans le cloud, où elle est accessible publiquement.

Déroulement : signature des valeurs mesurées​

  • Toutes les 15 minutes ou à la fin d'une transaction, un paquet de données contenant les valeurs mesurées correspondantes est constitué.

  • Un hash (SHA256) est calculé sur ces données.

  • Ce hash est chiffré (ECDSA 256) et enregistré comme signature.

  • Le paquet de données est envoyé avec la signature au cloud, où il est enregistré.

Déroulement : vérification des valeurs mesurées​

  • Le client reçoit le paquet de données contenant les données de mesure via l'application, le web ou un tiers.

  • Calcul du hash (SHA256) sur le paquet de données.

  • La Public Key de tous les compteurs smart-me est disponible publiquement dans le cloud (également via l'API)

  • Le client vérifie le hash du paquet de données à l'aide de la clé publique.

Paquets de données​

Afin de réduire au maximum la taille du paquet de données et donc le volume de données nécessaire à la transmission, smart-me utilise le format de données « Google Protocol Buffers » pour les valeurs mesurées. Les paquets de données sont structurés comme suit :

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 : le numéro de série du compteur (p. ex. 6300000) TimestampUtc : Unix Time Stamp (UTC) de ces données de mesure Values : liste de toutes les valeurs mesurées (CounterValue) de ce paquet de données.

CounterValue

Obis : code OBIS de la valeur mesurée (6 bytes). p. ex. { 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF } pour 1-0:1.8.1*255 (énergie active soutirage tarif 1) Value : la valeur mesurée Unit : l'unité de la valeur mesurée. Chez smart-me, généralement mWh (milliwattheures)

Transactions signées​

Les transactions se composent d'une valeur de début et d'une valeur de fin.

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 : le numéro de série du compteur (p. ex. 6300000) TransactionNumber : le numéro de la transaction. Ce numéro est incrémenté à chaque transaction. UserId : l'ID de l'utilisateur qui a démarré cette transaction. StartValues : les valeurs mesurées au début de la transaction (voir ci-dessus) EndValues : les valeurs mesurées à la fin de la transaction (voir ci-dessus)

Exemple​

Cet exemple montre la validation d'une transaction signée.

Paquet de données (transaction)

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

Signature

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

Calculer le hash (SHA256) du paquet de données :

SHA256(paquet de données) = 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

Valider le hash avec la Public Key au moyen d'ECDSA 256

OK

Désérialiser le paquet de données : le paquet de données peut être facilement désérialisé à l'aide de la définition Protobuffer (exemple visualisé en 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"
}
]
}
}

Aide à la lecture

StartValues

TimeStampUtc 1556194384 = 25.04.2019 12:04 (UTC)

Valeur mesurée 1 Obis : AQABCAD/ = 01 00 01 08 00 ff = 1-0:1.8.0*255 (énergie active soutirage total)

Valeur mesurée 1 : valeur 3830562339 mWh = 3830.562 kWh

Valeur mesurée 2 Obis : AQACCAD/ = 01 00 02 08 00 ff = 1-0:2.8.0*255 (énergie active injection total)

Valeur mesurée 2 : valeur 6177828 mWh = 6.177 kWh

EndValues

TimeStampUtc 1556194384 = 25.04.2019 12:13 (UTC)

Valeur mesurée 1 Obis : AQABCAD/ = 01 00 01 08 00 ff = 1-0:1.8.0*255 (énergie active soutirage total)

Valeur mesurée 1 : valeur 3833552299 mWh = 3833.552 kWh

Valeur mesurée 2 Obis : AQACCAD/ = 01 00 02 08 00 ff = 1-0:2.8.0*255 (énergie active injection total)

Valeur mesurée 2 : valeur 6177828 mWh = 6.177 kWh

-> Consommation d'énergie dans cette transaction : 3833.552 kWh - 3830.562 kWh = 2.99 kWh