TMC Projet 2015 2016

Transcription

TMC Projet 2015 2016
Master 2nde année
TMC
Projet
Échanges de messages sécurisés dans un réseau ad hoc de Raspberry Pi & nRF24L01
Contexte du projet
Développer un outil de communication sécurisé dans le cadre d’un réseau ad hoc :
⋆ utilisation du chiffrement asymétrique RSA avec des clés créées à partir d’une identité (IBE, « Identity
Based Encryption », basé sur la proposition de Jon Callas) ;
⋆ échange de messages chiffrés/authentifiés par radio « ultra low energy » : nRF24L01.
Décomposition fonctionnelle du projet
Sécurité
□ Gestion des identités sécurisées basée sur un IBE utilisant RSA :
⋄ embarqué sur chaque nœud ;
⋄ utilise un secret commun à tous les nœuds du réseau (secret du PKG) ;
⋄ utilise un PRNG pour la génération de la bi-clé RSA :
⋆ utilisation d’une « chaîne » de HMAC, dont la clé est le secret de l’IBE ;
⋆ le point de départ du PRNG est basé sur l’identité recherchée ;
⋆ utilisation du PRNG comme générateur aléatoire dans RSA pour la création des bi-clés.
□ échange sécurisé de A ⟹ B :
⋄ A récupère la clé publique de B auprès de l’IBE ;
⋄ A chiffre une clé de session AES à l’aide de la clé publique de B et l’envoi à B ;
⋄ A communique avec B par AES à l’aide de cette clé de session partagée ;
⋄ Les échanges doivent prendre en compte la nature de la couche physique : paquet de taille
restreinte, perte possible de paquet et authentification de l’émetteur des données : utilisation
du mode AES-GCM.
□
□
□
□
□
□
Radio
Communication Raspberry ⟺ nRF24L01 : bus SPI ;
Consommation : 40𝑚𝑤 (Wi-Fi 300𝑚𝑊 ) ;
bande de fréquences : ISM, « Industrial, Science & Medical » 2, 45𝐺𝐻𝑧 découpé en 126 canaux ;
codage des données : GFSK ;
puissance : limitée ;
MAC, « Medium Access Control », « est-ce que c’est pour moi ? » : « Shockburst ™ »
⋄ adressage ;
⋄ gestion des erreurs : CRC & acquittement, Retransmission ;
□ débit : 1𝑀𝑏𝑝𝑠 , 2𝑀𝑏𝑝𝑠 .
Protocole de communication
Couche 5 : application ⟶ ?
Couche 3 & 4 : protocole d’échange + IBE, message de de 32 octets, adresse de 5 octets ;
Couche 1 & 2 : nRF24L01 « Shockburst ™ ».
Gestion de la radio
□ choix du canal de communication : même canal ;
□ choix de l’émission/réception : l’émetteur transmets quant il le veut et on détecte les erreurs de la
couche 2 ⟶ réémission aléatoire ;
Resp. UE : P-F. Bonnefoi, http://p-fb.net/, « TMC–Projet » version du 9 février 2016, rédigé avec ConTEXt – Don’t Panic !
1/6
Utilisation du PRNG Fortuna pour la génération de clés RSA
Pour utiliser le PRNG Fortuna :
#! /usr/bin/python
nom_destinataire = "[email protected]"
from Crypto.Random.Fortuna import FortunaGenerator
generateur=FortunaGenerator.AESGenerator()
generateur.reseed("toto")
generateur.key.encode('hex')
print generateur.pseudo_random_data(32).encode('hex')
Géneration des clés RSA à l’aide du PKG et vérification de leur reproductibilité
#!/bin/python
import subprocess
from Crypto.Hash import HMAC
from Crypto.Hash import SHA512
mon_hmac=HMAC.new(key="mon_secret",digestmod=SHA512)
mon_hmac.update("[email protected]")
IDT = mon_hmac.digest()
from Crypto.Random.Fortuna import FortunaGenerator
generateur=FortunaGenerator.AESGenerator()
generateur.reseed(IDT)
from Crypto.PublicKey import RSA
cle = RSA.generate(2048,randfunc=generateur.pseudo_random_data)
fic_cle = open("ma_cle1.pem","w")
fic_cle.write(cle.exportKey("PEM"))
fic_cle.close()
generateur=FortunaGenerator.AESGenerator()
generateur.reseed(IDT)
cle = RSA.generate(2048,randfunc=generateur.pseudo_random_data)
fic_cle = open("ma_cle2.pem","w")
fic_cle.write(cle.exportKey("PEM"))
fic_cle.close()
resultat = subprocess.check_output('diff ma_cle1.pem ma_cle2.pem',shell=True)
if resultat :
print "Cles differentes :\n",resultat
else :
print "Cles identiques"
Resp. UE : P-F. Bonnefoi, http://p-fb.net/, « TMC–Projet » version du 9 février 2016, rédigé avec ConTEXt – Don’t Panic !
2/6
GCM
Utilisation dans le cadre du projet d’AES-GCM
Pour la construction du paquet avec chiffrement et authentification :
Header
Seq.
Data
IV
Plaintext
Addtl Auth Data
GCM Encryption
Header
Seq.
Ciphertext
Authentication Tag
Encrypted Data
ICV
GCM
Pour le 4:
déchiffrement
l’authentification
du paquet : a packet, showing how the fields of the security
Figure
Using GCMetto
encrypt and authenticate
encapsulation map onto the inputs and outputs of the authenticated encryption mode.
Header
Seq.
Encrypted Data
ICV
than the plaintext, and the decapsulation
halt and the plaintext
would be Tag
discarded rather
IV would Ciphertext
Authentication
than forwarded or further processed. After the operation, the header and sequence number can
Addtl Auth
Data
be checked, and their values
can be
trusted.
By including the sequence number in the IV,GCM
we Decryption
can satisfy the requirement that IV values be
unique. If that number is less than 96 bits long, it can be concatenated with another value in order
to form the IV. This other value could be constant, such as a string of zeros, or it could be a random
Plaintext it makes the inputs less predictable than
string, which adds to the security of the system because
they would be otherwise. The data needed to form the IV has to be known to both the encrypt
side and the decrypt
side, butSeq.
it need not all be included
Header
Data in the packet.
In some situations, it may be desirable to have the same GCM key used for encryption by more
Remarques
: Figure
5: case,
Usingcoordination
GCM to decrypt
and verify
the authenticity
of a packet.
than
one device.
In this
is needed
to ensure
the uniqueness
of the IV values. A
⋆
l’entête,
«
Header
»,
correspond
à
l’adresse
sur
5
octets
;
simple way in which this requirement can be met is to include a device-specific value in the IV,
⋆ lesasdonnées,
« Data
», correspond aux données sur 16 octets ;
such
a network
address.
tual property
restrictions.
These goals are important for high-speed network security, especially at
⋆ the
le ICV,
« Integrity Check Value », correspond à l’étiquette d’autentification calculée par AES-GCM,
link layer. This point is underscored by the fact that the IEEE 802.1 MAC Security Task Group
quiproposed
est au plustodeuse
16 mode
octets. as the standard’s mandatory-to-implement cryptoalgorithm [14].
has
⋆ on remarque que le numéro de séquence, « Seq. » ne peut être stocké dans le paquet qui est limité
6 Defining
and
Rationale
àProperties
32 octets
!
a mode
using generic composition (encrypt-then-authenticate [15]) is a simple way to
achieve
Solution
: a provably secure mode of operation, as long as the underlying components for encryption
and
authentication
areAuthentication
provably secure.
Ourpetite,
strategy,
similar
to that of
and: EAX, was to
▷ Passer
à une properties
taille d’«
» plus
parIts
exemple
surCWC
12 octets
The
important
of GCM aretag
summarized
incomme
Table 2.
primary
motivation
is the need
start with generic composition and then modify the algorithm in provably secure ways that better
foraddress
an authenticated
encryption
mode
that
can
be
efficiently
implemented
in
hardware
at very
Wikipedia
other requirements.
high data
rates,
achieves
high
performance
in
software,
is
provably
secure,
and
is
free
of
intellecThe authentication strength depends on the length of the authentication tag, as with all symmeCounter
mode is
the obviouscodes.
choiceHowever,
for the foundation
of anyauthentication
authenticated
encryption
tric message
authentication
the use of shorter
tags
with GCMmode,
is
since
it is the one
that isparameter.
fully parallelizable.
Our be
choice
discouraged.
Thewell-known
bit-length of encryption-only
the tag, denoted16
t, mode
is a security
In general, t may
any of
MAC
the best
solution
between
hardware
efficiency
(particularly,
onerepresents
of the following
fiveavailable
values: 128,
120, 112,
104, or
96. For certain
applications,
t mayparallelizbe 64
ability
and
requirements),
software
efficiency,
and
intellectual
property
or 32,
butmemory
the use of
these two tag lengths
constrains
thesecurity
length ofbound
the input
data
and the lifetime
restrictions.
of the key.Like CWC, we chose a parallelizable MAC based on the Carter-Wegman design [16]
thatAppendix
uses polynomial
However,
we guidance
used a binary
Galois
field rather
a 127-bit
C in NISThashing.
SP 800-38D
provides
for these
constraints
(for than
example,
if t =integer
32
fieldand
because
of
the
ease
and
efficiency
with
which
binary
fields
can
be
implemented
in
hardware.
the maximal packet size is 210 bytes, then the authentication decryption function should
be
Because
ourno
primary
motivation
is to
highthe
data
rates, the
choice
field
withthen
hardwareinvoked
more than
211 times;
if achieve
t = 64 and
maximal
packet
size of
is a215
bytes,
the
friendly multiplication operations is natural. Perhaps surprisingly, the binary field makes it easier
authentication decryption function should be invoked no more than 232 times).
to realize high-speed software implementations, as shown below.
In hardware, GCM adds a negligible amount of overhead compared to a pipelined AES implementation. OCB would share similar properties, except that it requires both an AES encryption and
AES decryption engine. CWC, on the other hand, has an expensive message authentication funcResp. UE : P-F. Bonnefoi, http://p-fb.net/, « TMC–Projet » version du 9 février 2016, rédigé avec ConTEXt – Don’t Panic !
17
3/6
▷ Déterminer comment modifier la bibliothèque Python pour obtenir un « Authentication tag » sur 96bits ;
▷ consulter le draft du 28 juillet 2014 https://tools.ietf.org/html/draft-ietf-avtcore-srtp
-aes-gcm-14
In both CCM and GCM, the algorithm negotiation selects what tag size
is to be used.
In GCM, the authentication tag is simply truncated to
the appropriate length, but CCM requires that the tag length be an
explicitly input to the algorithm as the Tag_Size_Field.
Dans lequel on peut lire que le « tag » est simplement tronqué à la taille voulu (d’où une proposition
améliorée appelée « CWC Mode »).
On constate que la récupération de l’« authentication tag » est tronquée : seuls les 12 premiers octets sont
récupérés, puis comparés avec l’« authentication tag » caclulé en interne : si les 12 octets sont les mêmes
alors l’authentication est réussie !
Chiffrement et authentification des messages
Pour chiffrer et authentifier les messages que nous échangerons par l’intermédiaire du composant radio
nRF24L01, nous utiliserons :
▷ les messages transportés sont d’au plus 32 octets ;
▷ un chiffrement symétrique sur une taille de données suffisante : AES-128, soient des blocs de données
chiffrées de taille multiple de 16 octets ;
▷ une authentification de ces messages à l’aide d’un GMAC, « Galois Message Authentication Code »,
de taille limitée à 96bits ou 12 octets ;
▷ un champs « numéro de séquence » pour gérer la fragmentation/défragmentation des messages de taille
supérieure à celle d’un paquet.
12 octets
4 octets
12 octets
données chiffrées
num séq
« authentication tag »
Dans le cadre du projet, on considérera que l’IBE est en mode offline, embarqué dans un composant sécurisé comme une carte à puce, sur le TMC.
Resp. UE : P-F. Bonnefoi, http://p-fb.net/, « TMC–Projet » version du 9 février 2016, rédigé avec ConTEXt – Don’t Panic !
4/6
Utilisation de la version béta de la bibliothèque PyCrypto incorporant AES-GCM
xterm
pef@samus:~/tmp/pycrypto-2.7a1$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Crypto
>>> print Crypto.__version__
2.7a1
>>> from Crypto.Cipher import AES
>>> cipher =
AES.new(key='totototototototo',mode=AES.MODE_GCM,nonce='1',mac_len=8)
>>> (a,b)= cipher.encrypt_and_digest('bonjour')
>>> a.encode('hex')
'2b59499b904ed4'
>>> b.encode('hex')
'ab0656a30b8d846d'
>>> cipher =
AES.new(key='totototototototo',mode=AES.MODE_GCM,nonce='1',mac_len=8)
>>> cipher.decrypt_and_verify(a,b)
'bonjour'
>>> cipher =
AES.new(key='totototototototo',mode=AES.MODE_GCM,nonce='1',mac_len=8)
>>> (a,b)= cipher.encrypt_and_digest('bonjour')
>>> a.encode('hex')
'2b59499b904ed4'
>>> b.encode('hex')
'ab0656a30b8d846d'
>>> cipher =
AES.new(key='totototototototo',mode=AES.MODE_GCM,nonce='0',mac_len=8)
>>> (a,b)= cipher.encrypt_and_digest('bonjour')
>>> a.encode('hex')
'0f11e2308749e1'
>>> b.encode('hex')
'a2a1a8b781417447'
>>> cipher =
AES.new(key='totototototototo',mode=AES.MODE_GCM,nonce='0',mac_len=8)
>>> cipher.decrypt_and_verify(a,b)
'bonjour'
>>>
>>> cipher =
AES.new(key='totototototototo',mode=AES.MODE_GCM,nonce='0',mac_len=8)
>>> cipher.decrypt_and_verify(a,'a2a1a8b781417448'.decode('hex'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/Crypto/Cipher/blockalgo.py", line
1035, in decrypt_and_verify
self.verify(mac_tag)
File "/usr/local/lib/python2.7/dist-packages/Crypto/Cipher/blockalgo.py", line
969, in verify
raise ValueError("MAC check failed")
ValueError: MAC check failed
⇒On vérifie que la version de PyCrypto est la bonne version ;
⇒On utilise AES en mode AES_GCM avec un nonce de 0 et une taille d’étiquette de 8 octets ;
⇒l’opération encrypt_and_digest permet de réaliser un chiffrement et une authentification : elle
⇒a qui est le chiffrement de la chaîne "bonjour" ;
⇒b qui est l’étiquette d’authentification ;
⇒On veut vérifier les données reçues : on recrée un objet AES muni des mêmes informations que précéretourne ici le tuple (a,b) :
⇒On fournie à la méthode decrypt_and_verify les valeurs de a et b obtenues précédemment et
demment (même clé et même nonce) ;
⇒On vérifie que le traitement est reproductuble.
⇒On essaye avec une valeur différente du nonce ;
⇒On modifie l’étiquette obtenue précédemment (on passe de 'a2a1a8b781417447' à
on obtient bien la chaîne initiale avec une authentification correcte ;
'a2a1a8b781417448') et on obtient une exception : ValueError("MAC check failed").
Resp. UE : P-F. Bonnefoi, http://p-fb.net/, « TMC–Projet » version du 9 février 2016, rédigé avec ConTEXt – Don’t Panic !
5/6
Travail à réaliser
□ Concevoir un protocole sécurisé permettant de transmettre des paquets d’au plus 32 octets et
comportant une adresse source et destination sur 5 octets chacune :
⋄ le message est chiffré et authentifié en AES-GCM-128.
□ Utilisation du Raspberry Pi et du composant nRF24L01 en mode alternat :
⋄ dérivation du code depuis l’exemple du programme « ping/pong » ;
⋄ A envoi à B la clé de session chiffrée avec la clé publique de B (ping) ;
⋄ A envoi un message chiffré à l’aide de la clé de session échangée (ping) ;
⋄ B déchiffre et affiche le message reçu (il peut confirmer la réception avec le pong).
□ Ce protocole est mis en œuvre dans un programme Python qui :
⋄ gère le PKG et manipule les différentes clés : la biclé RSA de l’utilisateur, la clé de session
⋄ crée le contenu du message chiffré et l’envoi par radio en utilisant une commande externe en
AES-128, les données d’authentification utilisées pour le GCM ;
C d’envoi de paquet :
⋆ dérivée du programme « ping/pong » de la bibliothèque de communication nRF24L01 ;
⋆ acceptant en entrée le paquet chiffré et authentifié, c-à-d les 42 octets qui le compose :
adresse source 5 octets adresse destination 5 octets message sur 32 octets
⋆ affichant à l’écran en notation hexadécimale/ASCII le contenu du paquet à envoyer :
⋄ reçoit, déchiffre et vérifie l’authentification d’un paquet en utilisant une commande externe en
C de réception d’un paquet :
⋆ dérivée du programme « ping/pong » de la bibliothèque de communication nRF24L01 ;
⋆ fournissant en sortie le paquet chiffré et authentifié, c-à-d les 42 octets qui le compose :
adresse source 5 octets adresse destination 5 octets message sur 32 octets
⋆ affichant le contenu du paquet en hexa/ASCII.
□ Vous réfléchirez et construirez votre protocole de manière à :
⋄ lier authentification, adresse, et clé publique de l’IBE (par exemple en vous inspirant de
⋄ partager la clé de chiffrement AES-128 entre expéditeur et destinataire en sachant que l’IBE
SUCV) ;
est présent sur les deux, inclus dans une carte à puce (dans votre programme Python vous
pourrez, bien sûr, simuler sa présence en disposant directement des éléments qu’il pourrait
vous donnez, mais en indiquant comment vous les récupérez auprès de lui) ;
⋄ proposer une fragmentation des échanges et une résistance aux pertes de paquets en utilisant
un numéro de séquence (en adaptant la taille du « tag authentication »).
□ Vous enverrez le résultat de votre travail sous forme d’une archive zip/tar.gz à [email protected]
avant le 26 février 2016.
Resp. UE : P-F. Bonnefoi, http://p-fb.net/, « TMC–Projet » version du 9 février 2016, rédigé avec ConTEXt – Don’t Panic !
6/6