Algorithmes de chiffrement communs
Algorithme de cryptage à sens unique de base:
Base64 à proprement parler, il appartient au format de codage, et non à l'algorithme de cryptage
MD5 (Messagedigestalgorithm5, algorithme d'information sur la digestion)
SHA (SecureHashalgorithme, Algorithme de hachage sécurisé)
HMAC (HashMessageAuthenticationCode, code d'authentification de message de hachage)
Cryptage symétrique complexe (DES, PBE), algorithmes de chiffrement asymétriques:
DES (DataencryptionStandard, algorithme de chiffrement des données)
PBE (Mot de passe-bascule, basé sur la vérification du mot de passe)
RSA (le nom de l'algorithme est nommé d'après l'inventeur: Ronrivest, Adi Shamir et Leonard Adleman)
DH (algorithme Diffie-Hellman, protocole de cohérence des clés)
DSA (algorithme DigitalSignature, signature numérique)
ECC (Elliptic Curves Cryptography)
Signature numérique
Brève description de l'algorithme
L'algorithme de signature numérique peut être considéré comme un algorithme de digestion de message avec une clé, et cette clé contient à la fois un public et une clé privée. C'est-à-dire que l'algorithme de signature numérique est une combinaison de l'algorithme de cryptage asymétrique et de l'algorithme de digestion de message.
Caractéristiques
Les algorithmes de signature numérique nécessitent la capacité de vérifier l'intégrité des données, d'authentifier les sources de données et de jouer un rôle dans la résistance au déni.
principe
L'algorithme de signature numérique comprend deux opérations: la signature et la vérification, qui suit les méthodes de signature de clé privée et de vérification de la clé publique.
Lors de la signature, la clé privée et les données à signer doivent être utilisées. Lors de la vérification, la clé publique, la valeur de signature et les données à signer doivent être utilisées. L'algorithme central est principalement l'algorithme de digestion du message.
1. Résumé du message
String beforedegist = "asdf"; System.out.println ("avant" Résumé: "+ Beforedegist); // Les informations initiales doivent être converties en un octet de flux d'octets [] PlainText = Beforedegist.getBytes (" UTF8 "); // Utilisez GetInstance (" Algorithm ") pour obtenir le message du message. = MessagediGest.getInstance ("sha-1"); String (messagediGest.digest (), "utf8");2. Encryption de clé privée
/ ** * Cet exemple est de crypter une information de chaîne avec une clé privée, puis de les déchiffrer avec la clé privée pour vérifier si elle est cohérente. La clé privée est cryptée, qui est un chiffrement symétrique * en utilisant un algorithme symétrique. For example: A uses a key to encrypt a file, and B needs the same key as A, and both parties share a * private key (and in the web environment, the private key is easily listened when passed) * * Attachment: The main symmetric algorithms are: DES (the actual key only uses 56 bits) * AES (supports three key lengths: 128, 192, 256 bits), usually 128 bits first, and the others are DESede, etc. * / <span style = "white-space: pre;"> </ span> string avant = "asdf"; Byte [] PlainText = avant.GetBytes ("UTF8"); // Étape 1. System.out.println ("Démarrer générer la clé AES."); // Obtenez une instance de KeyGenerator en utilisant l'algorithme AES KeyGenerator Keygen = keyGenerator.getInstance ("AES"); // Définir la longueur de clé 128 bits keygen.init (128); // générer une touche KeyGenerator (l'algorithme clé a juste été défini, aes) touche). keygen.generateKey (); System.out.println ("finir générer AES key =" + key);// Étape 2.
// Obtenez un chiffrement de classe de chiffrement de clé privée, définissant les informations de base du chiffre: la BCE est la méthode de chiffrement, et pkcs5padding est la méthode de remplissage cipher cipher = cipher.getinstance ("aes / ecb / pkcs5padding"); //System.out.println("/n "+ cipher.getProvider (). GetInfo ());// Étape 3.
// Utilisez la clé privée pour crypter System.out.println ("/ n crypter avec la clé privée ..."); // Utilisez la clé qui vient de générer comme paramètre et initialisez la classe de chiffrement en utilisant la clé privée obtenue tout à l'heure. Cipher.encrypt_mode signifie cryptage cipher.init (cipher.encrypt_mode, key); // le chiffre de la classe de cryptage de clé privée est crypté, et après le cryptage, un flux d'octet est retourné octet [] octet [] ciphertext = cipher.Dofinal (Plaintex String (CipherText, "UTF8"); System.out.println ("Complet avec cryptage de clé privée:" + After1);// Étape 4.
[Java] Afficher la copie simple // Utilisez la clé privée pour décrypter les informations chiffrées tout à l'heure pour voir si elle est cohérente. Cipher.decrypt_mode désigne la clé de décryptage System.out.println ("/ n décrypte avec la clé privée ..."); cipher.init (cipher.decrypt_mode, key); // décrypte le flux d'octet encntré cipher.dofinal (cipherText); String After2 = new String (newPlainText, "utf8"); System.out.println ("Décrit avec la clé privée:" + après2);3. Encryption de clé publique
String avant = "asdf"; byte [] PlainText = avant.GetBytes ("UTF8"); // Générez un générateur de clés RSA KeyPainerator (comme le nom implique: une paire de générateurs de clés) KeyPairGenerator Keygen = KeypArGenerator.getInstance ("RSA"); // Défusion de la longueur de clé 1024 Bits KeyGen.Initial (1024); Une clé via KeyPairGenerator, Remarque: La clé ici est une paire de clés! ! Keypair key = keygen.generateKeyPair (); // Obtenez une classe de chiffre RSA, cryptée en utilisant un chiffre de clé publique = Cipher.getInstance ("RSA / ECB / PKCS1PADDING"); // System.out.println ("/ n" + cipher.getProvider (). GetInfo ()); System.out.println ("/ n crypté avec la clé publique ..."); // cipher.encrypt_mode signifie cryptage, obtenir la clé publique à partir d'une paire de clés.getpublic () cipher.init (cipher.encrypt_mode, keytpublic ()); // encrypt avec la clé publique et return a Byte Stream byte byte [] Cipher; cipher.dofinal (PlainText); // Convertir le flux BYTE en chaîne dans UTF8 Format String After1 = new String (CiPherText, "UTF8"); System.out.println ("Utiliser le chiffrement de la clé publique:" + After1); // Decrypt System.out.println ("/ ndecrypt avec la clé privée ..."); // cipher.decrypt_mode signifie décrypption, obtenir la clé privée à partir d'une paire de keys key.getprivate () Cipher.init (Cipher.Decrypt_Mode, key.getPrivate ()); // décrypter avec la clé privée et renvoyer un flux byte octet [] newPlainText = cipher.dofinal (ciphertext); String after2 = new String (newplainText, "utf8"); System.out.println ("Decryption avec la clé privée:" + après2);4. Signature numérique
/ ** * Cet exemple est un exemple de signature numérique. Utilisez la clé privée RSA pour signer le message du message (se réfère ici aux données d'origine), puis utilisez la clé publique pour vérifier la signature * * a crypte les données avec la clé publique de B et l'envoie à B. B utilise la clé privée de B pour les décrypter pour obtenir la clé privée. La clé publique de B pour crypter une copie des données et l'envoyer à B. De cette façon, la question est: les données reçues par B? B, et A doit préparer deux parties: 1 et 2 * 1: A utilise la clé publique de B pour crypter les informations originales pour servir de confidentialité (seule la clé privée de B peut être non emballée, mais d'autres ne peuvent pas débapuler les autres clés, bien sûr, il est confidentiel) * 2: A utilise A de A pour signer le digestage de la clé privée d'origine. Passez-le à B. En même temps, C utilise la clé privée de C pour signer toutes les informations sur B. Ce que B veut accepter, ce sont les données de A (comme une demande de transfert), donc b * décrypte les deux informations reçues par A, et ce qui est non emballé est une clé de la clé de A (A avant = "Asdf"; avant.GetBytes ("UTF8"); // Formez une paire de clés publique RSA KeyPairGenerator keygen = keyPairGenerator.getInstance ("RSA"); keygen.Initialize (1024); Keypair key = keygen.generateKeyPair (); // signe avec la clé privée *************************************************** Signature Sig = signature.getInstance ("sha1withrsa"); sig.initsign (key.getPrivate ()); // objet Sig obtient la clé privée // objet signé obtient les données d'origine sig.update (PlainText); // objet Sig obtient les données d'origine (en réalité, le digest des données d'origine est utilisée, et le digest est à sens unique, c'est-à-dire un signature, c'est-à-dire un décrypté après l'algorithme de digest) Sig.sign (); // SIG Object utilise la clé privée pour signer les données d'origine et obtient la signature après la signature de la signature em.out.println (sig.getProvider (). GetInfo ()); String After1 = new String (Signature, "UTF8"); System.out.println ("/ nSign avec clé privée:" + After1); // Utilisez la clé publique pour vérifier la clé publique // Sign Objet obtient l'objet original d'informations Sig.Up.Update (sigtext); // SIG (sig.verify (signature)) {// objet SIG décrypte la signature avec une clé publique pour obtenir les données d'origine (c'est-à-dire le résumé), si true System.out.println ("La vérification de la signature est correcte !! {System.out.println ("La vérification de la signature a échoué !!");}5. Certificat numérique
/ ** * Cet exemple est une opération sur le fichier "Certificat numérique" * La plate-forme Java (installation JDK sur la machine) vous fournit un clés (bibliothèque de certificat). La commande keytool est fournie sous CMD pour créer la bibliothèque de certificat * * Avant d'exécuter cet exemple: * Créez un certificat dans le répertoire du disque C, spécifiez la bibliothèque de certificat pour être BocsoftKeyLib et créez un certificat avec l'alias TestCertification. Il spécifie qu'il est généré à l'aide de l'algorithme * RSA, et que la longueur de clé est 1024, et le certificat est valide pour 1 an * Le fichier de certificat d'exportation est TC.CER // Lire les informations du certificat à partir du fichier de certificat tc.cer CertificateFactory cf = CertificateFactory.getInstance ("x.509"); fileInputStream dans = new FileInputStream ("c: /tc.cer"); // Lisez le fichier dans le certificat de classe de certificat sous la forme d'un certificat de fichier C = CF.GenerateCertificate Conversion en chaîne: "+ c.toString ()); * // ou n'utilisez pas la méthode de code ci-dessus, lisez les informations de certificat directement à partir de la bibliothèque de certificat, qui est exactement la même que la chaîne ci-dessus pass =" Qazzaq "; FileInputStream in2 = new FileInputStream (" c: / bocsoftke ks = keystore.getInstance ("jks"); ksload (in2, pass.tocharay ()); string alias = "testCertification"; // alias est le certificat d'alias c = ks.getCertificate (alias); System.err.println ("Certificate Informations après convertification vers Tale X509 Il s'agit d'une sous-classe de la classe de certificat pour obtenir un certificat et implémente plus de méthodes x509certificate t = (x509certificate) c; // extraire les informations requises de l'information System.out.println ("Numéro de version:" + t.getVersion ()); System.out.println ("Serial Numéro: "+ t.getSerialNumber (). ToString (16)); System.out.println (" Nom du sujet ":" + t.getSubjectDn ()); System.out.println ("Issuer:" + T.GettissUerdn ()); System.out.println ("Pénérerie de validité: "+ t.getNotBefore ()); System.out.println (" Algorithme de signature: "+ t.getSigalGame ()); byte [] sig = t.getSignature (); // Signature Value PublicKey Pk = t.getPublickey (); Byte [] pkenc = Pk.GetCoced (); System.out.Println (") pour ") pour () pour (); i = 0; i <pkenc.length; i ++) {System.out.print (pkenc [i] + ",");} system.err.println (); // Date! "); // Vérifiez la validité de la signature du certificat et émettez un certificat CA au client via l'organisation du Centre de certification de certification (CA), tel que: Caroot.crt Fichier // Je n'ai pas le certificat délivré par le CA, donc le code suivant ne peut pas être exécuté / * FileInputStream dans 3 = New FileInputStream (" caroot.crt "); // Get the CARTICATE CACRITED CACE CAC = CACE (carot CF.GenerateCertificate (in3); System.out.println ("Vérification de validité de la date du certificat: expiré");} Catch (vérification de validité de la date du certificat: expiré "); } catch (vérification de validité de la date du certificat: expiré ");} catch (vérification de validité de la date du certificat: expiré"); } catch(Certificate's date validity check: expired"); } catch (FileNotFoundException ce) { ce.printStackTrace(); } catch (FileNotFoundException fe) { fe.printStackTrace(); } /*catch (IOException ioe){ } catch (KeyStoreException kse){ }*/catch (Exception e) {e.printStackTrace ();}}Résumer
Ce qui précède concerne les exemples de code complets de cryptage Java et de décryptage et de signatures numériques. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!