Il y a deux phrases qui disent ceci :
1) Les algorithmes et les structures de données sont une partie importante de la programmation. Si vous perdez les algorithmes et les structures de données, vous perdrez tout.
2) La programmation est constituée d'algorithmes et de structures de données. Les algorithmes et les structures de données sont l'âme de la programmation.
Remarque, ce n'est pas ce que j'ai dit. Il a été résumé par d'innombrables programmeurs. C'est très pratique et perspicace. Si vous voulez un développement durable à long terme, il est encore nécessaire d'étudier davantage d'algorithmes. Aujourd'hui, je vais vous parler de l'algorithme de chiffrement symétrique parmi les algorithmes de chiffrement, et ici je vais vous apprendre à programmer et à utiliser l'algorithme de chiffrement symétrique. Il comprend la programmation et l'utilisation de trois algorithmes de chiffrement symétriques : DES, 3DES et AES, et regorge d'informations utiles.
1. Algorithme cryptographique symétrique
L'algorithme cryptographique symétrique est l'algorithme de chiffrement le plus largement utilisé et le plus fréquemment utilisé aujourd'hui. Il n’est pas seulement utilisé dans l’industrie du logiciel, mais également dans l’industrie du matériel. Chaque fois que des exigences de sécurité sont impliquées dans diverses infrastructures, les algorithmes de chiffrement symétriques seront prioritaires.
La clé de cryptage et la clé de déchiffrement de l'algorithme cryptographique symétrique sont les mêmes. Pour la plupart des algorithmes cryptographiques symétriques, les processus de cryptage et de déchiffrement sont inversés.
(1) Modèle de communication de cryptage et de décryptage
(2) Caractéristiques : algorithme ouvert, petite quantité de calcul, vitesse de cryptage rapide, efficacité de cryptage élevée
(3) Faiblesse : les deux parties utilisent la même clé et la sécurité ne peut pas être garantie
Il existe deux types de chiffrements symétriques : les chiffrements par flux et les chiffrements par blocs, mais les chiffrements par blocs sont désormais couramment utilisés :
(4) Mode de fonctionnement du chiffrement par bloc
1) ECB : Livre de codes électronique (le plus couramment utilisé, chaque cryptage génère un groupe de texte chiffré indépendant et n'affectera pas les autres groupes de texte chiffré, c'est-à-dire le le même texte en clair produira le même texte chiffré après le cryptage)
2) CBC : lien de texte chiffré (couramment utilisé, avant que le cryptage du texte en clair ne doive être XOR avec le texte chiffré précédent, également le même texte en clair est crypté pour produire différents texte chiffré)
En plus de ces deux modes de fonctionnement couramment utilisés, il existe :
3) CFB : Retour de texte chiffré
4) OFB : Retour de sortie
5) CTR : Compteur
Ces cinq modes de fonctionnement sont principalement utilisés par les algorithmes en cryptographie lors de la réalisation de calculs d'inférence.
6. Méthode de remplissage du chiffrement par bloc
1) NoPadding : Pas de remplissage
2) PKCS5Padding :
3) ISO10126Padding :
7. Chiffres symétriques couramment utilisés :
1) DES (Data Encryption Standard, norme de cryptage des données)
2) 3DES (Triple DES, DESede, un algorithme qui effectue le cryptage triple DES)
3) AES (Advanced Encryption Standard, norme de cryptage de données avancée, l'algorithme AES peut résister efficacement à l'algorithme d'attaque contre DES)
Prenons un regarde ceci d'abord Une comparaison simple des trois algorithmes :
Voyons comment utiliser les trois algorithmes DES / 3DES / AES pour implémenter le cryptage symétrique :
Algorithme 2.DES
1.DES : Norme de cryptage des données, un algorithme typique dans le domaine des algorithmes de cryptage symétriques
Caractéristiques : clé courte (56 bits), courte. cycle de vie (pour éviter d'être Crack)
3. Implémentation Java
1) Générer la clé
KeyGenerator keyGen = KeyGenerator.getInstance("DES");//密钥生成器 keyGen.init(56);//初始化密钥生成器 SecretKey secretKey = keyGen.generateKey();//生成密钥 byte[] key = secretKey.getEncoded();//密钥字节数组
2) Cryptage
SecretKey secretKey = new SecretKeySpec(key, "DES");//恢复密钥 Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作类 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,加密模式 byte[] cipherByte = cipher.doFinal(data);//加密data
3) Décryptage
SecretKey secretKey = new SecretKeySpec(key, "DES");//恢复密钥 Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作类 cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//解密data
Nous pouvons trouver ce cryptage. Nous définissons simplement différents modes de décryptage.
Algorithme 3.3DES
1.3DES : Augmentez la longueur de la clé à 112 bits ou 168 bits, et améliorez la sécurité en augmentant le nombre d'itérations
2. : La vitesse de traitement est lente, le temps de calcul de la clé est long et l'efficacité du cryptage n'est pas élevée
3. Implémentation Java
1) Générer la clé
KeyGenerator keyGen = KeyGenerator.getInstance("DESede");//密钥生成器 keyGen.init(168); //可指定密钥长度为112或168,默认为168 SecretKey secretKey = keyGen.generateKey();//生成密钥 byte[] key = secretKey.getEncoded();//密钥字节数组
2) Cryptage 3DES
SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢复密钥 Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作类 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//加密data
3) Décryptage 3DES
SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢复密钥 Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作类 cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//解密data
4.Algorithme AES (recommandé)
1.AES : Advanced Data Encryption Standard, qui peut résister efficacement à toutes les attaques connues contre l'algorithme DES
2. Caractéristiques : temps d'établissement de clé court, bonne sensibilité, faibles besoins en mémoire, haute sécurité
3. Générer une clé <🎜. >
KeyGenerator keyGen = KeyGenerator.getInstance("AES");//密钥生成器 keygen.init(128); //默认128,获得无政策权限后可为192或256 SecretKey secretKey = keyGen.generateKey();//生成密钥 byte[] key = secretKey.getEncoded();//密钥字节数组
SecretKey secretKey = new SecretKeySpec(key, "AES");//恢复密钥 Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作类 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//加密data
SecretKey secretKey = new SecretKeySpec(key, "AES");//恢复密钥 Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作类 cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//解密data