Ahmed Elkhalipha
Enseignant Chercheur en Sécurité et Cryptologie
Master II RSS
khalifaahmedou@yahoo.fr
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
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
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
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
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
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
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
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
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
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
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 ) ;
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
2 Pour extraire la clé publique ou privée de l’objet KeyPair, on utilise les deux
méthodes suivantes :
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
Exemple
KeyPair kp = kpg.generateKeyPair() ;
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
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
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
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
java.security.KeyFactory
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
Exemple 1 : DH
KeyFactory factory = KeyFactory.getInstance(”DH”) ;
X509EncodedKeySpec publickeyspec =
new X509EncodedKeySpec(pub− encodedkey) ;
PKCS8EncodedKeySpec privatekeyspec =
new PKCS8EncodedKeySpec (priv− encodedkey) ;
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
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 :
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
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” ;
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
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
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
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
Instanciation
javax.crypto.KeyAgreement
Une instance de cette classe est créée à l’aide de l’une des méthodes suivantes :
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
Initialisation
1 On peut initialiser l’objet KeyAgreement avec une clé privée donnée
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
La méthode doPhase()
public final Key doPhase ( Key key, boolean lastPhase) throws
InvalidKeyException, IllegalStateException
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
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
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
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
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
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
Engine : KeyGenerator
1 Récupération d’une instance de KeyGenerator
getInstance(String algorithm)
getInstance(String algorithm, Provider provider)
getInstance(String algorithm, String provider)
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()
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
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é)
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
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é
Besoins
1 S’assurer de l’identité du propriétaire d’une 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é
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é
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é
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.
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
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é.
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
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.
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
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
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
Exemple (suite)
3. Pour extraire une clé privée, il faut connaı̂tre son alias et son mot de
passe.
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
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
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