Académique Documents
Professionnel Documents
Culture Documents
Chapitre 0 Introduction
M. Remane NIZAR
PhD student in Coding, Cryptology, Algebra and application of UCAD
Data science, IA and IOT engineer of UVS - ATOS
Information System Security engineer of ESP
remane.nizar@ucad.edu.sn
Master 1 Réseaux télécommunications
Deuxieme semestre
3 mai 2023
Wireshark
Free portscanner
Filezilla client
Kali Linux
Firewall ASA
Pfsense
Langage Java
Objectifs spécifiques
Comprendre les concepts de bases de la sécurité ;
Acquérir les connaissances théoriques et techniques indispensables
dans le domaine de la sécurité des réseaux et systèmes ;
Concevoir, implémenter et prendre en charge la sécurité des
réseaux et systèmes ;
Développer un esprit critique et des compétences en matière de
résolution des problèmes de sécurité.
Introduction
Dans cette première section du chapitre on va plus s’intéresser au
généralité de la sécurité des SI ;
Système d’Information (SI) est un ensemble organisé de ressources
(matériels, logiciels, personnel, données et procédures) qui permet de
regrouper, de classifier, de traiter et de diffuser de l’information
sur un phénomène donné ;
La sécurité des systèmes d’information (SSI) est l’ensemble des
moyens techniques, organisationnels, juridiques et humains
nécessaire et mis en œuvre afin d’assurer la protection :
Des informations (données)
Du matériel
Des logiciels
Provider
• fournisseur des services ce qui fait qu’un provider cryptographique est
un ensemble de classes qui implémentent des algorithmes cryptographiques
offrant des services cryptographique.
• Structuré en un ou plusieurs packages(JAVA) qui implémentent
concrètement une ou plusieurs procédures cryptographiques.
1 security.provider.1=sun.security.provider.Sun
2 security.provider.2=sun.security.rsa.SunRsaSig
3 security.provider.3=com.sun.net.ssl.internal.ssl.Provider
4 security.provider.4=com.sun.crypto.provider.SunJCE
Interface
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
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()
Bloc
Chiffre ou déchiffre par bloc de bits de taille fixe Exemple : DES,
SERPENT, AES, BLOWFISH · · ·
Flux
Chiffre ou déchiffre des flux de bits. Opère par 1 bit ou 1 byte Exemple :
RC4, A5, ORYX, SEAL · · ·
NB
En mode CFB et OFB le chiffrement par blocs peut opérer comme un
chiffrement de flux
NB
Quelque soit le mécanisme de padding, l’information sur le nombre de byte
ajouté doit être incluse dans le padding
*PKCS : Public-Key Cryptography Standards. RSA Laboratories
Figure – Pading
Figure – ECB
Figure – CBC
Figure – CFB
NB
En mode CFB et OFB l’algorithme de chiffrement peut opérer sur un
nombre de bits inférieur à la taille normale de bloc
Pour cela spécifier CFBn à la place de CFB Avec n représentant le nombre
de bits à traiter à la fois
Exemple
Cipher aCipher = Cipher.getInstance("AES") ;
Cipher aCipher = Cipher.getInstance("AES/ECB/PKCS5Padding") ;
Cipher aCipher = Cipher.getInstance("AES/OFB8/NoPadding") ;
Chiffrer et déchiffrer
Petit volume de données
Traiter d’un seul coup
public final byte[] doFinal(byte[] input)
Grand volume de données
Traiter en plusieurs coups
public final byte[] update(byte[] input)
Finir avec
public final byte[] doFinal()
Utilité
Chiffrer ou déchiffrer des fichiers
Utilisation de CipherInputStream
FileInputStream fis = new FileInputStream("fichier ini") ;
FileOutputStream fos = new FileOutputStream("fichier final") ;
CipherInputStream cis = new CipherInputStream(fis, aCipher) ;
byte[] buffer = new byte[16] ; int nbBytesLu = 0 ;
while ((nbBytesLu = cis.read(buffer)) != -1) fos.write(buffer, 0,
nbBytesLu) ;
fis.close() ;
fos.close() ;
NB
fichier final est la transformation à l’aide de aCipher de fichier ini
M. Remane NIZAR PhD student in Coding, Cryptology,
Sécurité Algebra
des Systèmes etand application
Réseaux avancéofChapitre
UCAD Data
0 Introduction
science,
3 mai 2023
IA and IOT
63 /engine
88
Classes utilitaires : CipherOutputStream
Utilité
Chiffrer ou déchiffrer des fichiers
Utilisation de CipherOutputStream
FileInputStream fis = new FileInputStream("fichier ini") ;
FileOutputStream fos = new FileOutputStream("fichier final") ;
CipherOutputStream cos = new CipherOutputStream(fos, aCipher) ;
byte[] buffer = new byte[16] ; int nbBytesLu = 0 ;
while ((nbBytesLu = fis.read(buffer)) != -1) cos.write(buffer, 0,
nbBytesLu) ;
fis.close() ;
fos.close() ;
NB
fichier final est la transformation à l’aide de aCipher de fichier ini
M. Remane NIZAR PhD student in Coding, Cryptology,
Sécurité Algebra
des Systèmes etand application
Réseaux avancéofChapitre
UCAD Data
0 Introduction
science,
3 mai 2023
IA and IOT
64 /engine
88
Protection de la SecretKey
Scellement
SealedObject sealedSK = new SealedObjec(aSecretKey, aCipher) ;
ObjectOutputStream aOOS = new ObjectOutputStream(aFOS) ;
aOOS.writeObject(sealedSK) ;
aOOS.close() ;
Récupération
ObjectInputStream aOIS = new ObjectInputStream(aFIS) ;
SealedObject sealedSecretKey = (SealedObject) aOIS.readObject() ;
aOIS.close() ;
SecretKey aSecretKey = (SecretKey)sealedSK.getObject(aCipher) ;
Initialisation
On peut initialiser l’objet KeyPairGenerator pour ré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.
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() ;
Initialisation du Cipher
init(int opmode, Key)
init(int opmode, Key, SecureRandom)
opmode : ENCRYPT MODE , DECRYPT MODE, WRAP MODE,
UNWRAP MODE
Chiffrer ou déchiffrer
public final byte[] doFinal(byte[] input)
Diffie - Hellman
Protocole d’établissement de clé
Permet à 2 ou plusieurs parties d’établir de manière sûre une clé
secrète commune
La clé peut être utilisée pour chiffrer une future communication entre
les parties
JCE : Cléprivée
Récupération : aKeyPair.getPrivate()
Type : DHPrivateKey
Format : PKCS8
NB
DHPublicKey et DHPrivateKey sont encodées avec les paramétres
Diffie-Hellman correspondants
KeyAgreement engine
1 Récupération d’une instance de KeyAgreement
1 des 3 méthodes getInstance("DH"· · · )
2 Initialisation du KeyAgreement
init(Key)
init(Key, AlgorithmParameterSpec)
AlgorithmParameterSpec : DHParameterSpec
3 Exécution d’une étape intermédiaire du DH
public final Key doPhase(Key key,boolean lastPhase)
4 Génération du secret partag
byte[] generateSecret()
SecretKey generateSecret(String algorithm)
MGF1 : algorithme
MGFParameters : fonction Hash
MGF1(seed, l)
n = ceil(l/hash.len)
soit r une chaine d’octets vide
for i = 0 to k - 1 do
r = r ||hash(seed ||I 2OSP (0, 4)) ;
end
return l premiers octets de r
M. Remane NIZAR PhD student in Coding, Cryptology,
Sécurité Algebra
des Systèmes etand application
Réseaux avancéofChapitre
UCAD Data
0 Introduction
science,
3 mai 2023
IA and IOT
78 /engine
88
Mask Generation Function (MGF)
Objectif
Détecter les modifications frauduleuses de données
Intégrité des données
Caractéristiques
Compression de données
quelques soit la taille du input, la taille du output est inférieur et fixe
Transformation à sens unique
facile à compresser, impossible(complexité) à décompresser
Résistance aux collisions
inputs : x = y , output h(x ) = h(y )
Faiblesse
Ne résiste pas à l’attaque ”man in the middle”
M. Remane NIZAR PhD student in Coding, Cryptology,
Sécurité Algebra
des Systèmes etand application
Réseaux avancéofChapitre
UCAD Data
0 Introduction
science,
3 mai 2023
IA and IOT
80 /engine
88
JCA : Message digest
Calcul du digest
Traiter d’un seul coup public byte[] digest(byte[] input)
Traiter en plusieurs coups public void update(byte input) public byte[]
digest()
Objectif
Intégrité et authenticité des données
Détecter les modifications frauduleuses de données
Vérifier l’authenticité des données
Caractéristiques
Basé sur un message digest : HMAC
Utilise une clé secrète
Faiblesse
Ne garantit pas la non-répudiation
Initialisation du Mac
init(key)
init(key, AlgorithmParameterSpec)
AlgorithmParameterSpec : HMACParameterSpec
Calcul du mac
Traiter d’un seul coup public final byte[] doFinal(byte[] input)
Traiter en plusieurs coups public void update(byte[] input) public final
byte[] doFinal()
Classe : org.bouncycastle.crypto.generators.
DSAParametersGenerator
1 Création d’une instance de DSAParametersGenerator
new DSAParametersGenerator()
2 Initialisation du DSAParametersGenerator
init(keysize, int certitutePrime, secureRandom)
512 < keysize < 1024 et keysize = 512+ n.64
3 Génération des paramètres de domaine