L'algorithme de chiffrement symétrique est un algorithme de chiffrement antérieur doté d'une technologie mature. Dans l'algorithme de chiffrement symétrique, l'expéditeur des données traite le texte en clair (données originales) et la clé de chiffrement (mi yue) avec un algorithme de chiffrement spécial, les transformant en texte chiffré complexe et les envoyant. Une fois que le destinataire a reçu le texte chiffré, s'il souhaite déchiffrer le texte original, il doit utiliser la clé utilisée pour le cryptage et l'algorithme inverse du même algorithme pour déchiffrer le texte chiffré afin de le restaurer en texte clair lisible. Dans l'algorithme de chiffrement symétrique, une seule clé est utilisée. L'expéditeur et le destinataire utilisent cette clé pour chiffrer et déchiffrer les données. Cela nécessite que le déchiffreur connaisse la clé de chiffrement à l'avance.
Les algorithmes de chiffrement Java simples sont :
BASE à proprement parler est un format de codage, pas un algorithme de chiffrement
MD (algorithme de résumé de message, algorithme de résumé de message)
SHA (Secure Hash Algorithm, algorithme de hachage sécurisé)
HMAC (Hash Message Authentication Code, code d'authentification du message de hachage)
Tapez 1. SOCLE
Base est l'une des méthodes de codage les plus courantes pour transmettre des codes d'octets sur Internet. Vous pouvez consulter RFC~RFC, qui contient des spécifications détaillées pour MIME. Le codage de base peut être utilisé pour transmettre des informations d'identification plus longues dans un environnement HTTP. Par exemple, dans le système Java Persistence Hibernate, Base est utilisé pour coder un long identifiant unique (généralement un UUID de -bit) dans une chaîne, qui est utilisée comme paramètres dans les formulaires HTTP et les URL HTTP GET. Dans d'autres applications, il est souvent nécessaire d'encoder les données binaires sous une forme adaptée au placement dans une URL (y compris les champs de formulaire masqués). À l’heure actuelle, le codage de base est illisible, c’est-à-dire que les données codées ne seront pas directement visibles à l’œil nu. (Source : Encyclopédie Baidu)
Code d'implémentation Java :
package com.cn. Cryptage unidirectionnel ; import sun.misc.BASEDecoder; import sun.misc.BASEEncoder;/*Le cryptage et le déchiffrement BASE sont bidirectionnels, et la solution inverse peut être trouvée. cours. Bien qu'il puisse être trouvé et utilisé dans le JDK, il est introuvable dans l'API. Les classes commençant par sun et com.sun dans JRE ne sont pas documentées. Elles appartiennent à la base des bibliothèques de classes Java et Javax. La plupart de leurs implémentations sont liées à la plateforme sous-jacente et ne sont généralement pas recommandées. À proprement parler, BASE est un format de codage, alors que les algorithmes de non-chiffrement incluent principalement les deux classes BASEEncoder et BASEDecoder. Il suffit de savoir utiliser les méthodes correspondantes. De plus, le nombre d'octets générés après le chiffrement BASE est un multiple de . Si le nombre d'octets est insuffisant, remplissez-le avec le symbole =. BASE Selon la définition de la RFC, Base est défini comme suit : Le codage de transfert de contenu de base est conçu pour décrire toute séquence de bits sous une forme qui n'est pas facilement reconnue directement par les humains. (Le Base Content-Transfer-Encoding est conçu pour représenter des séquences arbitraires d'octets sous une forme qui n'a pas besoin d'être lisible par l'homme.) Couramment vu dans les e-mails et le cryptage HTTP Lors de l'interception des informations http, vous trouverez les champs de nom d'utilisateur et de mot de passe pour la connexion. opérations cryptées via BASE. */public class BASE { /** * Décryptage BASE* * @param key * @return * @throws Exception */ public static byte[] decryptBASE(String key) throws Exception { return (new BASEDecoder()).decodeBuffer(key ); } /** * Chiffrement BASE* * @param key * @return * @throws Exception */ public static String encryptBASE(byte[] key) throws Exception { return (new BASEEncoder()).encodeBuffer(key); } public static void main(String[] args) { String str=""; try { String result= BASE.encryptBASE(str.getBytes()); out.println("result=====données chiffrées=========="+result); octet result[]= BASE.decryptBASE(result String); str=new String(result); System.out.println("str========Données décryptées========"+str } catch (Exception e) { e.printStackTrace( ); } }}
Deuxième type.
MD est Message-Digest Algorithm (Message-Digest Algorithm), qui est utilisé pour garantir une transmission complète et cohérente des informations. Il s'agit de l'un des algorithmes de hachage largement utilisés dans les ordinateurs (également traduit par algorithme de résumé et algorithme de hachage). MD a été généralement implémenté dans les langages de programmation traditionnels. Le calcul des données (telles que les caractères chinois) dans une autre valeur de longueur fixe est le principe de base de l'algorithme de hachage. Les prédécesseurs de MD sont MD, MD et MD. Largement utilisé dans la technologie de cryptage et de décryptage, souvent utilisé pour la vérification de fichiers. vérifier? Quelle que soit la taille du fichier, une valeur MD unique peut être générée après MD. Par exemple, l'étalonnage ISO actuel est l'étalonnage MD. Comment l'utiliser ? Bien entendu, la valeur MD est générée après le passage de l'ISO via MD. Généralement, les amis qui ont téléchargé Linux-ISO ont vu la chaîne MD à côté du lien de téléchargement. Il permet de vérifier si les fichiers sont cohérents.
implémentation Java :
package com.cn.Cryptage unidirectionnel;import java.math.BigInteger;import java.security.MessageDigest;/*MD (algorithme de résumé de message, algorithme de résumé de message) Habituellement, nous n'utilisons pas directement le cryptage MD ci-dessus. Habituellement, le tableau d'octets généré par MD est transmis à BASE puis chiffré pour obtenir la chaîne correspondante Digest : assembly*/public class MD { public static final String KEY_MD = "MD" public static String getResult(String inputStr) { System .out.println("========Données avant cryptage :"+inputStr bigInteger=null try { MessageDigest md =); MessageDigest.getInstance(KEY_MD); byte[] inputData = inputStr.getBytes(); md.update(inputData); bigInteger = new BigInteger(md.digest()); } System.out.println("Après le cryptage MD :" + bigInteger.toString()); bigInteger.toString(); } public static void main(String args[]) { try { String inputStr = "Cryptage simple"; getResult(inputStr);
L'algorithme MD présente les caractéristiques suivantes :
. Compressibilité : pour les données de n'importe quelle longueur, la longueur de la valeur MD calculée est fixe.
, Facile à calculer : il est facile de calculer la valeur MD à partir des données originales.
. Résistance à la modification : si des modifications sont apportées aux données d'origine, même si un seul octet est modifié, la valeur MD résultante sera très différente.
, Faible anti-collision : connaissant les données originales et leur valeur MD, il est très difficile de trouver des données avec la même valeur MD (c'est-à-dire des données falsifiées).
, Forte anti-collision : Il est très difficile de trouver deux données différentes pour qu'elles aient la même valeur MD.
La fonction de MD est de permettre à des informations de grande capacité d'être « compressées » dans un format confidentiel (c'est-à-dire de convertir une chaîne d'octets de n'importe quelle longueur en une chaîne de chiffres hexadécimaux d'une certaine longueur) avant de signer la clé privée avec un code numérique. logiciel de signature. Outre MD, les plus célèbres sont sha-, RIPEMD et Haval.
Le troisième type.SHA
L'algorithme de hachage sécurisé s'applique principalement à l'algorithme de signature numérique DSA défini dans la norme de signature numérique DSS. Pour les messages d'une longueur inférieure à ^ bits, SHA produit un résumé de message d'un bit. Cet algorithme a été développé et amélioré par des experts en chiffrement au fil des années et est de plus en plus perfectionné et largement utilisé. L'idée de cet algorithme est de recevoir un morceau de texte en clair, puis de le convertir en un morceau de texte chiffré (généralement plus petit) de manière irréversible. Cela peut également être simplement compris comme la prise d'une chaîne de codes d'entrée (appelée pré-mappage). ou informations), et Le processus de conversion de ceux-ci en une séquence de sortie de courte longueur à chiffres fixes, c'est-à-dire une valeur de hachage (également appelée résumé de message ou code d'authentification de message). La valeur de la fonction de hachage peut être considérée comme une « empreinte digitale » ou un « résumé » du texte en clair, de sorte que la signature numérique de la valeur de hachage peut être considérée comme la signature numérique du texte en clair.
implémentation Java :
package com.cn. Le chiffrement unidirectionnel ; importer java.math.BigInteger ; importer java.security.MessageDigest ;/*SHA (Secure Hash Algorithm, algorithme de hachage sécurisé), la signature numérique et d'autres outils importants dans les applications de cryptographie, sont largement utilisés. Il est largement utilisé dans les domaines de la sécurité de l’information tels que le commerce électronique. Bien que SHA et MD aient été piratés par des méthodes de collision, SHA reste un algorithme de chiffrement sécurisé reconnu et est plus sécurisé que MD*/public class SHA { public static final String KEY_SHA = "SHA" public static String getResult( String inputStr) { BigInteger sha =null; System.out.println("========Données avant cryptage :"+inputStr byte[] inputData =); inputStr.getBytes(); try { MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA); messageDigest.update(inputData); sha = new BigInteger(messageDigest.digest()); sha.toString()); } catch (Exception e) {e.printStackTrace();} return sha.toString(); } public static void main(String args[]) { try { String inputStr = "Cryptage simple"; getResult(inputStr); catch (Exception e) { e.printStackTrace();
Comparaison SHA avec MD
Puisque les deux sont dérivés de MD, SHA et MD sont très similaires. En conséquence, leurs points forts et autres caractéristiques sont similaires, mais il existe plusieurs différences :
Sécurité contre les attaques par force brute : la différence la plus significative et la plus importante est que le résumé SHA est plus long que le résumé MD. En utilisant des techniques de force brute, la difficulté de générer un message dont le résumé est égal à un résumé de message donné est une opération de l'ordre de grandeur pour MD et une opération de l'ordre de grandeur pour SHA-. De cette façon, SHA- a une plus grande force contre les attaques par force brute.
Sécurité contre la cryptanalyse : en raison de la conception de MD, qui est vulnérable aux attaques de cryptanalyse, SHA- semble moins vulnérable à de telles attaques.
Vitesse : SHA- fonctionne plus lentement que MD sur le même matériel.
Le quatrième type.HMAC
HMAC (Hash Message Authentication Code, code d'authentification de message de hachage, protocole d'authentification basé sur l'algorithme de hachage de clé. Le principe du code d'authentification de message pour réaliser l'authentification est d'utiliser une fonction et une clé publiques pour générer une valeur de longueur fixe comme identifiant d'authentification. Utiliser ceci Identifie l'intégrité du message. Utilisez une clé pour générer un petit bloc de données de taille fixe, à savoir MAC, et ajoutez-le au message, puis transmettez-le en utilisant la clé partagée avec l'expéditeur pour l'authentification.
Code d'implémentation Java :
package com.cn.Cryptage unidirectionnel ;/*HMACHMAC (Authentification des messages de hachage Code, code d'authentification de message de hachage, protocole d'authentification basé sur l'algorithme de hachage de clé. Le principe du code d'authentification de message est d'utiliser une fonction et une clé publiques pour générer une valeur de longueur fixe comme identifiant d'authentification, et d'utiliser cet identifiant pour authentifier l'intégrité de. le message.Sexe.Utilisez une clé pour générer un petit bloc de données de taille fixe, à savoir MAC, et ajoutez-le au message, puis transmettez-le. Le destinataire utilise la clé partagée avec l'expéditeur pour l'authentification, etc. */import. javax.crypto.KeyGenerator;importer javax.crypto.Mac; importer javax.crypto.SecretKey; importer javax.crypto.spec.SecretKeySpec; importer com.cn.comm.Tools;/** * Composant de chiffrement de base*/ classe abstraite publique HMAC { public static final String KEY_MAC = "HmacMD"; /** * Initialiser la clé HMAC* * @return * @throws Exception */ public static String initMacKey() throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC); SecretKey secretKey = keyGenerator.generateKey(); return BASE.encryptBASE(secretKey.getEncoded()); } /** * Chiffrement HMAC : méthode principale * * @param data * @param key * @return * @throws Exception */ public static String encryptHMAC (byte[] data, String key) throws Exception { SecretKey secretKey = new SecretKeySpec(BASE.decryptBASE(key), KEY_MAC); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); return new String(mac.doFinal(data)); chaîne statique getResult(String inputStr) { String path=Tools.getClassPath(); fileSource=path+"/file/HMAC_key.txt"; System.out.println("========Données avant cryptage :"+inputStr=null; try { byte[] inputData = inputStr); getBytes(); String key = HMAC.initMacKey(); /*Générer la clé*/ System.out.println("Mac key:===" + key); Tools.WriteMyFile(fileSource,key); result= HMAC.encryptHMAC(inputData, key); System.out.println("Après le cryptage HMAC :===" + result } catch (Exception e) {e.printStackTrace( );} return result.toString(); } public static String getResult(String inputStr) { System.out.println("========Données avant cryptage :"+inputStr); String path=Tools.getClassPath(); String fileSource=path+"/file/HMAC_key.txt"; ;; try { /*Lire la clé du fichier*/ key=Tools.ReadMyFile(fileSource); System.out.println("getResult key:===" + key } catch); (Exception e) { e.printStackTrace();} String result=null; try { byte[] inputData = inputStr.getBytes(); /*Encrypt data*/ result= HMAC.encryptHMAC(inputData, key); .println("Après le cryptage HMAC :===" + result); } catch (Exception e) {e.printStackTrace();} return result.toString( } public static void main(String args[]) { try { String inputStr = "Cryptage simple"; /*Utilisez la même clé : Chiffrez les données : Vérifiez si les résultats des deux cryptages sont les mêmes*/ getResult(inputStr getResult(inputStr); ); } catch (Exception e) { e.printStackTrace();
Le contenu ci-dessus représente les différents algorithmes de cryptage (quatre types) couramment utilisés en Java partagés par l'éditeur. J'espère qu'il vous plaira.