Vous êtes sur la page 1sur 66

Sécurité Avancer

Ahmed Elkhalipha
Enseignant Chercheur en Sécurité et Cryptologie
Master II RSS
khalifaahmedou@yahoo.fr

Chapitre 2: Gestion des clés et certificats

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 1/1
plan du cours

SOMMAIRE
1 Génération de clés
1 Génération de paire de clés publique et privée
2 Protocole de Diffie-Hellman
3 Génération d’une clé Secrète

2 Gestion de l’identité d’une Clé


1 java.security.KeyStore
2 Type du KeyStore
3 Importer ou Exporter des données de ou vers KeyStore

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 2/1
Génération de clés

Génération de clés

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 3/1
Génération de clés

Génération de clés

Interfaces
java.security.Key
L’interface qui encapsule une clé cryptographique.
java.security.PrivateKey
L’interface qui encapsule une clé privée.
java.security.PublicKey
L’interface qui encapsule une clé publique.
javax.crypto.SecretKey
L’interface qui encapsule une clé secrète.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 4/1
Génération de clés

Génération de clés

Les méthodes à implémenter pour l’interface Key

getAlgorithm() : retourne un String représentant le nom de l’algorithme


utilisé pour la génération de la clé.

getFormat() : retourne un String représentant le nom du format de la clé

getEncoded() : retourne un tableau de byte représentant la valeur de la clé


codée suivant le format précisé.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 5/1
Génération de clés

Génération de clés

Exemple de format d’une clé

1 X.509 : Standard de syntaxe d’information de clé publique conçu par


l’Union internationale des télécommunications pour les infrastructures à
clés publiques.

2 PKCS#8 : Standard de syntaxe d’information de clé privée conçu par les


laboratoires RSA.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 6/1
Génération de clés Génération de paire de clés publique et privée

Génération de paire de clés publique et privée

Les sous interfaces les plus connues de l’interface PublicKey et PrivateKey

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 7/1
Génération de clés Génération de paire de clés publique et privée

Génération de paire de clés publique et privée

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 8/1
Génération de clés Génération de paire de clés publique et privée

RSAPrivateKey et RSAPublicKey

Génération de clés RSA

1 Choisir deux nombres premiers p et q très grands.


2 Calculer n = p × q.
3 Calculer ϕ(n) = (p − 1)(q − 1).
4 Sélectionner un entier e vérifiant 0 < e < ϕ(n) et pgcd(e, ϕ(n)) = 1.
5 Trouver d tel que 0 < dϕ(n) et ed ≡ 1 mod ϕ(n).
6 La clé publique est constituée de e (l’exposant publique) et n (le module).
7 La clé privée est constituée de d (l’exposant privé) et n.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 9/1
Génération de clés Génération de paire de clés publique et privée

RSAPrivateKey et RSAPublicKey

package java.security.interfaces

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 10 / 1
Génération de clés Génération de paire de clés publique et privée

DSAPrivateKey et DSAPublicKey

Génération des paramètres du DSA-domaine

1 Choisir un nombre premier q vérifiant : 2159 < q < 2160


2 Choisir un entier t : 0 < t < 8.
3 Choisir un nombre premier p vérifiant : q divise p − 1 et
2511+64t < p < 2512+64t
4 Choisir un entier g d’ordre q .
4.1 Choisir un entier h ∈ [1, p − 1]
4.2 Calculer g = h(p−1)/q mod p .
4.3 si g = 1 alors retour à 4.1.

5 Retourner (p, q, g ).

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 11 / 1
Génération de clés Génération de paire de clés publique et privée

DSAPrivateKey et DSAPublicKey

Génération de la DSA-paire de clés

Entrée : DSA-domaine de paramètres (p, q, g ).


Sortie : clé publique y et clé privée x .
1 Choisir un entier x ∈ [1, q − 1].
2 Calculer y = g x mod p .
3 Retourner (y , x).

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 12 / 1
Génération de clés Génération de paire de clés publique et privée

DSAPrivateKey et DSAPublicKey

package java.security.interfaces

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 13 / 1
Génération de clés Génération de paire de clés publique et privée

DHPrivateKey et DHPublicKey

package javax.crypto.interfaces

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 14 / 1
Génération de clés Génération de paire de clés publique et privée

Classe java.security.KeyPair

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 15 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés

java.security.KeyPairGenerator

Une instance de cette classe est créée à l’aide de l’une des méthodes de factory
suivantes :
public static KeyPairGenerator getInstance( String algorithm ) throws
NoSuchAlgorithmException
public static KeyPairGenerator getInstance(String algorithm, Provider
provider) throws NoSuchAlgorithmException
public static KeyPairGenerator getInstance(String algorithm, String provider)
throws NoSuchAlgorithmException, NoSuchProviderException
Le paramètre ”algorithm” peut être remplacé par :
”RSA” exemple de provider ”SUN”
”DH” exemple de provider ”SunJCE”
”DSA” exemple de provider ”SUN”

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 16 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés

Initialisation
On peut initialiser l’objet KeyPairGenerator pour générer une paire de clés d’une
longueur keysize à l’aide de la méthode :
public void initialize ( int keysize ) ;
On peut aussi introduire une source d’aléatoire :
public void initialize ( int keysize , SecureRandom random ) ;

Ces deux méthodes rejettent une exception InvalidParameterException si le


keysize choisi n’est pas supporté par l’objet KeyPairGenerator.

Pour le ”DSA” et le ”DH” le keysize est un multiple de 64 compris entre 512 et


1024. Pour le ”RSA”, c’est un multiple de 8 supérieur ou égal à 512.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 17 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés

1 Finalement on récupère la paire de clés KeyPair à l’aide de la méthode


suivante :

public KeyPair generateKeyPair()

2 Pour extraire la clé publique ou privée de l’objet KeyPair, on utilise les deux
méthodes suivantes :

public PrivateKey getPrivate()

public PublicKey getPublic()

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 18 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés

Exemple

KeyPairGenerator kpg = KeyPairGenerator.getInstance(”DH”, ”SunJCE”) ;

kpg.initialize(704, new SecureRandom()) ;

KeyPair kp = kpg.generateKeyPair() ;

DHPrivateKey privatekey = (DHPrivateKey) kp.getPrivate() ;

DHPublicKey publickey = (DHPublicKey)kp.getPublic() ;

Les objets Key, PrivateKey, PublicKey, RSAPrivateKey, RSAPublicKey,


DSAPrivateKey, ... ont une représentation opaque : l’accès à leur structures est
limité.
L’utilisateur ne peut pas les créer avec ses propres données.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 19 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés

Clés à représentation transparente


Une classe est dite à représentation transparente, si on peut accéder, via
ses méthodes, à la structure de l’objet de cette classe.
On peut extraire les renseignements souhaités sur l’objet et intervenir dans sa
construction.

Clés de spécification : java.security.spec.KeySpec


Les classes les plus connues implémentant l’interface KeySpec.

DHPrivateKeySpec DHPublicKeySpec

DSAPrivateKeySpec DSAPublicKeySpec

RSAPrivateKeySpec RSAPublicKeySpec

EncodedKeySpec

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 20 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés

Exemple

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 21 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 22 / 1
Génération de clés Génération de paire de clés publique et privée

Création d’un objet KeyFactory

java.security.KeyFactory

public static KeyFactory getInstance(String algorithm) throws


NoSuchAlgorithmException

public static KeyFactory getInstance(String algorithm, Provider provider) throws


NoSuchAlgorithmException

public static KeyFactory getInstance(String algorithm, String provider) throws


NoSuchAlgorithmException, NoSuchProviderException

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 23 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés


Transformation d’un KeySpec en Key
Pour générer une clé publique ou privée on utilise les deux méthodes suivantes.
public final PrivateKey generatePrivate(KeySpec keySpec) throws
InvalidKeySpecException

public final PublicKey generatePublic(KeySpec keySpec) throws


InvalidKeySpecException

Transformation d’un Key en KeySpec


Pour transformer une clé en clé de spécification on utilise la méthode suivante.

public final KeySpec getKeySpec(Key key, Class keySpec) throws


InvalidKeySpecException

Elle transforme la clé key en KeySpec. keySpec indique la classe de spécification


à laquelle l’objet retourné appartient.
Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 24 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés

Exemple 1 : DH
KeyFactory factory = KeyFactory.getInstance(”DH”) ;

X509EncodedKeySpec publickeyspec =
new X509EncodedKeySpec(pub− encodedkey) ;

PKCS8EncodedKeySpec privatekeyspec =
new PKCS8EncodedKeySpec (priv− encodedkey) ;

DHPublicKey publickey = (DHPublicKey)factory.generatePublic(publickeyspec) ;

DHPrivateKey privatekey =
(DHPrivateKey)factory.generatePrivate(privatekeyspec) ;

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 25 / 1
Génération de clés Génération de paire de clés publique et privée

Générateur de paire de clés


Exemple 2 : DSA
KeyFactory factory = KeyFactory.getInstance(”DSA”) ;

DSAPublicKeySpec pub− keyspec =


new DSAPublicKeySpec(y− key, p− param− key, q− param− key, g− param− key ) ;

DSAPublicKey publickey = (DSAPublicKey)factory.generatePublic(pub− keyspec) ;

DSAPrivateKeySpec priv− keyspec =


new DHPublicKeySpec(x− key, p− param− key, q− param− key, g− param− key ) ;

DSAPrivateKey privatekey =
(DSAPrivateKey)factory.generatePrivate(priv− keyspec) ;

Exemple 3 : DSA
KeyFactory factory = KeyFactory.getInstance(”DSA”) ;
DSAPrivateKeySpec privatespec =
factory.getKeySpec (dsaprivatekey, DSAPrivateKeySpec.class) ;
Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 26 / 1
Génération de clés Génération de paire de clés publique et privée

AlgorithmParameterSpec

Remarque
1 Le générateur KeyPairGenerator peut être initialisé en utilisant la méthode
suivante :

void initialize(AlgorithmParameterSpec params)


void initialize(AlgorithmParameterSpec params, SecureRandom random)

2 Les classes les plus connues implémentant l’interface


java.security.spec.AlgorithmParameterSpec sont :
DHGenParameterSpec, DHParameterSpec,
DSAParameterSpec, IvParameterSpec,
PBEParameterSpec, PSSParameterSpec,
RC2ParameterSpec, RC5ParameterSpec,
RSAKeyGenParameterSpec

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 27 / 1
Génération de clés Génération de paire de clés publique et privée

AlgorithmParameterSpec

Exemple : AlgorithmParameterSpec

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 28 / 1
Génération de clés Génération de paire de clés publique et privée

AlgorithmParameterSpec

Exemple : RSAKeyGenParameterSpec

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 29 / 1
Génération de clés Génération de paire de clés publique et privée

AlgorithmParameterSpec

Exemple : DSAParameterSpec

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 30 / 1
Génération de clés Génération de paire de clés publique et privée

AlgorithmParameterSpec

Exemple : ECParameterSpec

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 31 / 1
Génération de clés Génération de paire de clés publique et privée

AlgorithmParameterSpec

Exemple : DHParameterSpec
Paramètres de domaine DH

1 Choisir un nombre premier p ( le module).

2 Choisir un entier naturel g (la base ) d’ordre p − 1 modulo p.

3 On peut fixer une longueur de bit l pour la clé privée (x).


Retourner (p, g , l).

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 32 / 1
Génération de clés Génération de paire de clés publique et privée

AlgorithmParameterSpec

Exemple : DHParameterSpec

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 33 / 1
Génération de clés Génération de paire de clés publique et privée

AlgorithmParameterSpec

Exemple : DHParameterSpec
String moduleString =
”bbddabdfe2a1884f072e5229e4da66588956b3f07abaaf3378d8b7cb90c4929e”
+ ”dd1c3f051cb8bffe7b41e9dc0df0f7fa1d09c80e225afdcd3393ab2c93a7ef3d” ;

String baseString =
”65bc413e60804978c13f3af0c09741f38dff9361dfdb0bb5c6b84d7a5435e4a7”
+”135507d5b1e3c52ad091cb3c0904125a1a0f6f58e3bb5fe7090ab989e8f9e04a” ;

BigInteger p = new BigInteger (moduleString, 16) ;

BigInteger g = new BigInteger (baseString, 16) ;

DHParameterSpec dhps = new DHParameterSpec(p, g) ;

KeyPairGenerator kpg = KeyPairGenerator.getInstance(”DH”) ;

kpg.initialize( dhps) ;

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 34 / 1
Génération de clés Protocole de Diffie-Hellman

Génération de DH-paire de clés

Entrée : DH-domaine de paramètres (p, g , l).

Sortie : clé publique y et clé privée x.

1 choisir un entier x ∈ [1, p − 1] de longueur de bit l ;

2 calculer y = g x mod p ;

3 Retourner (y , x).

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 35 / 1
Génération de clés Protocole de Diffie-Hellman

Echange de clé DH

Protocole de la mise en accord sur une clé secrète entre Abdou et Bineta

Abdou détient sa DH- paire de clés privée et publique (xa , ya ) ;

Bineta détient sa DH- paire de clés privée et publique (xb , yb ) ;

Abdou transmet à Bineta sa clé publique ya ;

Bineta transmet à Abdou sa clé publique yb ;

Abdou calcule yb xa = g xb xa mod p ;

Bineta calcule ya xb = g xa xb mod p ;

La donnée secrète est k = yb xa = ya xb .

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 36 / 1
Génération de clés Protocole de Diffie-Hellman

Echange de clé DH

Protocole de la mise en accord sur une clé secrète entre n personnes


Chaque personnei détient sa DH-paire de clés privée et publique (xi , yi ).
1 Répéter (n − 1) fois :
Pour i allant de 1 à n faire :
si i < n
personnei transmet sa clé public yi à personne(i+1)
x
yi+1 ←− yi i+1 mod p
si i = n
personnen transmet sa clé à personne1
y1 ←− ynx1 mod p
2 la donnée secrète générée est k = g x1 ···xn mod p

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 37 / 1
Génération de clés Protocole de Diffie-Hellman

Protocole de la mise en accord sur une clé secrète

Instanciation
javax.crypto.KeyAgreement
Une instance de cette classe est créée à l’aide de l’une des méthodes suivantes :

public static final KeyAgreement getInstance( String algorithm )


throws NoSuchAlgorithmException

public static KeyAgreement getInstance(String algorithm, String provider)


throws NoSuchAlgorithmException, NoSuchProviderException

Le paramètre ”algorithm” peut être remplacé par : ”DH”

Exemple de provider ”SunJCE”

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 38 / 1
Génération de clés Protocole de Diffie-Hellman

Protocole de la mise en accord sur une clé secrète

Initialisation
1 On peut initialiser l’objet KeyAgreement avec une clé privée donnée

public void init ( Key key )

2 On peut aussi introduire une source d’aléatoire

public void init ( Key key , SecureRandom random )

3 On peut en plus spécifier les paramètres d’algorithmes

public final void init( Key key, AlgorithmParameterSpec params,


SecureRandom random)

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 39 / 1
Génération de clés Protocole de Diffie-Hellman

Génération de la clé secrète

La méthode doPhase()
public final Key doPhase ( Key key, boolean lastPhase) throws
InvalidKeyException, IllegalStateException

Cette méthode est appelée à chaque échange de clés,

key est la clé publique reçue.

lastPhase indique si c’est le dernier échange ou non.

Si lastPhase est false doPhase() retourne une DHPublicKey.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 40 / 1
Génération de clés Protocole de Diffie-Hellman

Génération de la clé secrète

La méthode generateSecret()
Une fois que toutes les phases ont été réalisées, on peut générer notre donnée
secrète à l’aide des méthodes :
public final byte[] generateSecret() throws IllegalStateException

public final int generateSecret ( byte[] sharedSecret, int offset) throws


IllegalStateException, ShortBufferException

Remplie le tableau sharedSecret par la donnée secrète à partir de offset. Elle


retourne le nombre de byte placé dans sharedSecret.

public final SecretKey generateSecret(String algorithm) throws


IllegalStateException, NoSuchAlgorithmException, InvalidKeyException

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 41 / 1
Génération de clés Protocole de Diffie-Hellman

Génération de la clé secrète entre 3 personnes

Exemple
Abdou, Bineta et Mamadou souhaitent générer une clé secrète commune.
Leurs DH-Paires de clés respectives sont (x0 , y0 ), (x1 , y1 ) et (x2 , y2 ).

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 42 / 1
Génération de clés Protocole de Diffie-Hellman

Génération de la clé secrète entre 3 personnes


DHPublicKey [] pub = {y0 , y1 , y2 };
DHPrivateKey [] priv = {x0 , x1 , x2 };
KeyAgreement [] ka = new KeyAgreement [3]
for (int i = 0; i < 3; i + +){
ka [i]= KeyAgreement.getInstance(”DH”) ;
ka[i].init(priv[i]) ;
}
int c =1 ;
while (c < 3){
for (int i = 0; i < 3; i + +){
if (i > 0){
Key resultkey = ka[i].doPhase ( pub[i-1] , c == 2 ) ;
if( resultkey instanceof PublicKey)
pub[i] = resultkey ;
}
if (i == 0){
Key resultkey = ka[0].doPhase ( pub[2] , c == 2) ;
if( resultkey instanceof PublicKey)
pub[0] = resultkey ;
}
}
c++ ;
}
SecretKey[] secretkey = new SecretKey[ 3 ] ;
for (int i =0 ; i¡3 ; i++)
SecretKey secretkey [i] = ka[i].generateSecret(”DES”) ;

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 43 / 1
Génération de clés Génération d’une clé Secrète

Génération d’une clé Secrète : Clé cryptographiquement


sûre

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 44 / 1
Génération de clés Génération d’une clé Secrète

SecretKey à partir de CSPRNG avec KeyGenerator

Engine : KeyGenerator
1 Récupération d’une instance de KeyGenerator
getInstance(String algorithm)
getInstance(String algorithm, Provider provider)
getInstance(String algorithm, String provider)

2 Initialisation du KeyGenerator (Facultative mais intéressante)


init(int keysize)
init(SecureRandom random)
init(int keysize, SecureRandom random)

3 Génération de la SecretKey
public final SecretKey generateKey()

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 45 / 1
Génération de clés Génération d’une clé Secrète

Interface : SecretKey

1 Méthodes de SecretKey
String getAlgorithm()
String getFormat()
byte[] getEncoded()

2 Sérialisation : L’interface SecretKey est sérialisable.


Enregistrer la SecretKey dans un fichier à l’aide d’un ObjectOutputStream
Plus tard récupérer la SecretKey à l’aide d’un ObjectInputStream

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 46 / 1
Génération de clés Génération d’une clé Secrète

Générateur de nombres aléatoires crypto. sûres

Engine : SecureRandom
Construit autour d’un Message Digest (MD)
Utilise le MD d’un seed comme état interne et un compteur initialisé à zéro
Nombre aléatoire généré = MD(état interne + compteur incrémenté)

1 Récupération d’une instance de SecureRandom


SecureRandom aSecureRandom = new SecureRandom() ;
SecureRandom aSecureRandom =
SecureRandom.getInstance(”SHA1PRNG”) ;

2 Initialisation avec un seed (Facultative)


aSecureRandom.setSeed(seed) ;

3 Génération des bytes aléatoires


byte[] randomBytes = new byte[128] ;
aSecureRandom.nextBytes(randomBytes) ;
Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 47 / 1
Génération de clés Génération d’une clé Secrète

PBE : SecretKey à partir de mot de passe

Password Based Encryption : PBE


Objectif :
Créer une clé cryptographiquement sûre à partir de mot de passe.

Réduire l’efficacité d’une attaque par dictionnaire.

1 Spécification de clé PBE


password en char[]
salt en byte[] : donnée de préférence aléatoire concaténée au password
un nombre d’itérations : nombre d’application d’un MD sur password + salt

2 Une Factory de SecretKey PBE


Engine : SecretKeyFactory
Instance : 1 des 3 getInstance(...)
Méthode : SecretKey generateSecret(KeySpec keySpec)

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 48 / 1
Génération de clés Génération d’une clé Secrète

PBE : SecretKey à partir de mot de passe

1 Spécification de clé PBE


PBEKeySpec aPBEKeySpec = new PBEKeySpec(password, salt, iteration) ;

2 Une Factory de SecretKey PBE


SecretKeyFactory aSecretKeyFactory =
SecretKeyFactory.getInstance(”PBEWITHSHAAND256BITAES-CBC-BC”) ;
SecretKey aSecretKey = aSecretKeyFactory.generateSecret(aPBEKeySpec) ;

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 49 / 1
Gestion de l’identité d’une Clé

Gestion de l’identité d’une Clé

Besoins
1 S’assurer de l’identité du propriétaire d’une clé.

2 Stocker des clé.

3 Transmettre des clé.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 50 / 1
Gestion de l’identité d’une Clé

Gestion de l’identité d’une Clé

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 51 / 1
Gestion de l’identité d’une Clé

Gestion de l’identité d’une Clé

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 52 / 1
Gestion de l’identité d’une Clé

Gestion de l’identité d’une Clé

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 53 / 1
Gestion de l’identité d’une Clé java.security.KeyStore

java.security.KeyStore

KeyStore
KeyStore est une classe qui permet le stockage de clés et certificats.
Elle dispose de deux entrée :
1 Entrée de clés (Key Entry) : Réservée à l’ajout de clés privées et les
certificats correspondant aux clés publiques associées. Notamment les clés
secrètes. Cette entrée doit être protégée par un mot de passe.

2 Entrée des certificats sûrs (Trusted Certificate Entry) : Réservée à


l’ajout de certificats transmis par une autorité de certification ou une
personne de confiance.

Entrée de clé ou de certificat est identifiée par un alias.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 54 / 1
Gestion de l’identité d’une Clé java.security.KeyStore

java.security.KeyStore

Pour Créer un objet de la classe KeyStore on utilise les


méthodes de factory suivantes :

1 public static KeyStore getInstance(String type) throws KeyStoreException

2 public static KeyStore getInstance(String type, String provider ) throws


KeyStoreException, NoSuchProviderException

3 public static KeyStore getInstance(String type, Provider provider) throws


KeyStoreException

Pour la première méthode, KeyStoreException est déclenchée si type n’est fourni


par aucun provider. Pour les deux autres méthodes, elle se déclenche si type n’est
pas fourni par provider.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 55 / 1
Gestion de l’identité d’une Clé Type du KeyStore

Type du KeyStore

C’est un standard de syntaxe pour stocker des clés privées, des clés publiques et
des certificats en les protégeant en confidentialité et en intégrité.

Types Exemples de provider


JKS Sun
JCEKS SunJCE
PKCS12 SunJSSE , BC
BKS BC

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 56 / 1
Gestion de l’identité d’une Clé Type du KeyStore

Type du KeyStore

JKS-Format (java key store), le plus ancien KeyStore-format . Il permet le


stockage des clés privées et des certificats sûrs.

JCEKS-Format introduit avec le JCE, il permet en plus des clés privées et


publiques, le stockage des clés secrètes. Il se base pour la protection des clés
privées ou secrètes sur le chiffrement triple-DES.

PKCS12 fourni par SunJSSE le format ne dispose pas d’une entrée pour les
certificats sûrs.

PKCS12 fourni par BC le format dispose d’une entrée pour les certificats sûrs.
Les alias sont considérés comme des données sensibles et donc sont protégés.

Dans les trois premiers formats, les alias ne sont pas considérés comme des
données sensibles et donc ne sont pas protégés.

Pour plus de détails voir le chapitre8 du livre ”Beginning Cryptography with


Java” de David Hook
Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 57 / 1
Gestion de l’identité d’une Clé Importer ou Exporter des données de ou vers KeyStore

Importer ou Exporter des données de ou vers KeyStore

1 Pour enregistrer les données du KeyStore dans un fichier on utilise la


méthode

public final void store( OutputStream stream, char[] password) throws


KeyStoreException, IOException, NoSuchAlgorithmException,
CertificateException.

2 Pour charger les données d’un fichier vers l’objet KeyStore

public final void load( InputStream stream, char[] password) throws


IOException, NoSuchAlgorithmException, CertificateException

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 58 / 1
Gestion de l’identité d’une Clé Importer ou Exporter des données de ou vers KeyStore

Entrée de clé(Key Entry)

Pour entrer une clé privée key d’alias alias et des certificats chain associés à key
on utilise la méthode suivante :

public final void setKeyEntry (String alias, byte[] key, Certificate[] chain)
throws KeyStoreException

Si alias existe déjà, la nouvelle clé key et ses certificats remplaceront l’ancienne
clé.
Notons que la clé key doit être chiffrée sous le format :
EncryptedPrivateKeyInfo.

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 59 / 1
Gestion de l’identité d’une Clé Importer ou Exporter des données de ou vers KeyStore

Entrée de clé(Key Entry)


Exemple
1. Considérons keystore un objet KeyStore et pbe− wrapted− privatekey une
clé privée wrapée1 (emballé) à l’aide de l’algorithme
”PBEWithSHA1AndDESede”.
EncryptedPrivateKeyInfo epki = new
EncryptedPrivateKeyInfo(”PBEWithSHA1AndDESede”,
pbe− wrapted− privatekey) ;
keystore.setKeyEntry (”aliaskey”, epki.getEncoded(),
certificates− chaine) ;
2. On peut aussi introduire un mot de passe pour protéger la clé privée à
l’aide de la méthode suivante :
keystore.setKeyEntry(String alias, Key key, char[] password,
Certificate[] chain) throws KeyStoreException

1
sera traitée en détail dans la partie chiffrement.
Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 60 / 1
Gestion de l’identité d’une Clé Importer ou Exporter des données de ou vers KeyStore

Entrée de clé(Key Entry)

Exemple (suite)

3. Pour extraire une clé privée, il faut connaı̂tre son alias et son mot de
passe.

public final Key getKey(String alias, char[] password) throws


KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException

4. Pour vérifier si KeyStore contient une entrée de clé.

public final boolean isKeyEntry(String alias) throws KeyStoreException

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 61 / 1
Gestion de l’identité d’une Clé Importer ou Exporter des données de ou vers KeyStore

Entrée de certificats sûrs (Trusted Certificates Entry)

1 Pour ajouter un certificat à un KeyStore, on utilise la méthode


suivante :
public final void setCertificateEntry(String alias, Certificate cert) throws
KeyStoreException
2 Pour vérifier si KeyStore contient une entrée de certificat :
public final boolean isCertificateEntry(String alias) throws
KeyStoreException
3 Pour extraire un certificat, il faut connaı̂tre son alias :
public final Certificate getCertificate(String alias) throws
KeyStoreException public final Certificate[] getCertificateChain(String alias)
throws KeyStoreException
4 Pour connaı̂tre l’alias d’un certificat :
public final String getCertificateAlias( Certificate cert) throws
KeyStoreException
Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 62 / 1
Gestion de l’identité d’une Clé Importer ou Exporter des données de ou vers KeyStore

Autres Méthodes de KeyStore.

Méthodes Fonctionnement
public final int size() Retourne le nombre d’entrées du KeyStore
public final void deleteEntry(String alias) Supprime l’entrée identifiée par alias
public final Date getCreationDate( String alias) Retourne la date de créations de l’entrée identifiée par alias

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 63 / 1
Gestion de l’identité d’une Clé Importer ou Exporter des données de ou vers KeyStore

Exemple

1 Instanciation
KeyStore ks = KeyStore.getInstance(”JKS”) ;
2 Initialisation
ks.load(null, null) ;
3 Entrer une clé privée
ks.setKeyEntry(”firstkey”, pair.getPrivate(), ”lacrose”.toCharArray(),
chain− certificats) ;
4 Entrer un certificat
ks.setCertificateEntry(”firstcert”,certificat ) ;
FileOutputStream fos = new FileOutputStream (new File (”.keystore”)) ;
5 Stocker les données de ks dans le fichier ” .keystore ”
ks.store(fos, ”lagora”.toCharArray()) ;
fos.close() ;

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 64 / 1
Gestion de l’identité d’une Clé Importer ou Exporter des données de ou vers KeyStore

Exemple

KeyStore ks1 = KeyStore.getInstance(”JKS”) ;

FileInputStream fis = new FileInputStream (new File (”.keystore”)) ;

ks1 charge les entrées enregistrées dans le fichier ”.keystore”

ks1.load(fis, ”lagora”.toCharArray()) ;

System.out.println(ks1.getKey(”firstkey”, ”lacrose”.toCharArray())) ;

fis.close() ;

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 65 / 1
Gestion de l’identité d’une Clé Importer ou Exporter des données de ou vers KeyStore

Fin

FIN DU CHAPITRE 3

Ahmed Elkhalipha (L.A.C.G.A.A. / D.M.I. / F.S.T.) Introduction à l’architecture cryptographique java 2019-2020 66 / 1