Cet article décrit les fonctions de chiffrement et de décryptage implémentées par Java sur la base de l'algorithme de cryptage Symmétrique DES. Partagez-le pour votre référence, comme suit:
Catégories liées au cryptage:
SecureRandom est hérité de la classe Java.util.Random
Il existe trois types de constructeurs de cette classe, les exemples suivants sont:
SecureRandom () construit un générateur de nombres aléatoires sécurisé (RNG) qui implémente l'algorithme de nombre aléatoire par défaut.
SecureRandom (Byte [] Seed) construit un générateur de nombres aléatoires sécurisé (RNG) qui implémente l'algorithme de nombre aléatoire par défaut.
DeskeySpec est utilisé pour générer le contenu clé de la clé à l'aide de la clé d'origine.
Deskeyspec a deux constructeurs:
DeskeySpec (key byte []) crée un objet DeskeySpec en utilisant les 8 premiers octets de la clé comme contenu clé de la touche DES.
Deskeyspec (key byte [], int offset) crée un objet DeskeySpec, en utilisant les 8 premiers octets dans la clé qui commence par et contient offset comme contenu clé de la touche de DES-EDE.
SecretKeyFactory, une usine de clé utilisée pour convertir une clé (clé de cryptage OPIC de la clé de type) en spécification clé (représentation transparente du matériau clé sous-jacent), et vice versa. Secret Key Factory fonctionne uniquement sur des clés secrètes (symétriques).
L'objet SecretKey, l'objet de clé secrète, génère une clé secrète en appelant la méthode de la méthode générée de jeu (DeskeySpec de bureau) de l'usine de clés secrètes
La classe Cipher fournit des fonctions de mot de passe pour le cryptage et le déchiffrement, et obtient des instances en appelant Cipher's GetInstance ("DES")
L'objet Cipher appelle la méthode init () pour initialiser l'objet. Les paramètres spécifiques de la méthode init () sont déterminés en fonction de la situation spécifique, y compris les constantes cryptées et décryptées.
Enfin, appelez la méthode Dofinal () de Cipher pour le chiffrement et le décryptage.
Ici, je voudrais vous poser une question. Qu'il s'agisse du premier type d'encodage à l'aide de Base64Encoder ou du deuxième type de codage org.apache.commons.codec.binary.base64, lors de la conversion de la chaîne en octet et octet en chaîne, UTF-8 / GBK et d'autres encodages sont nécessaires pour coder. Est-ce décodé?
1. Utilisez Sun.Misc.base64Decoder et Base64encoder pour le décodage et le codage
Package com.soufun.com; Importer java.io.ioException; Importer java.security.nosuchalgorithMexception; import java.security.securerandom; import java.util.date; import javax.crypto.cipher; javax.crypto.spec.deskeyspec; // Encodage d'importation 64 bits de Sun Import Sun.Misc.Base64Decoder; import Sun.Misc.Base64Encoder; / ** * @ Auteur WHD * * Encodeur même si vous importez le package Sun.Misc, une erreur sera rapportée. Pour le moment, vous pouvez supprimer votre package JRE et l'importer à nouveau. * / classe publique Desutil {// Définir la méthode de cryptage privée finale de chaîne statique des = "des"; chaîne statique finale privée utf8 = "gbk"; STATIC SecretKeyFactory KeyFactory = NULL; static {try {keyfactory = SecretKeyFactory.getInstance ("DES"); } Catch (NosuchalgorithMexception e) {// Bloc de capture généré automatiquement de TODO E.PrintStackTrace (); }} public static void main (String [] args) lève une exception {long début = new Date (). GetTime (); String data = "Aaades Encryption Test"; // Remarque: Pendant le processus de cryptage et de décryptage, la longueur de clé doit être un multiple de 8. String key = "qazwsXed"; System.err.println (Encrypt (données, clé)); System.err.println (Decrypt (Encrypt (données, clé), clé)); long fin = new Date (). getTime (); System.out.println (End-Begin); } / ** * Description Crypts en fonction de la valeur de clé * @param data * @param key cryption key byte array * @return * @throws exception * / public static String Encrypt (String data, string key) lève une exception {// Utilisez l'encodage spécifié pour obtenir le contenu à crypter. Généralement, la clé secrète est des lettres ou des nombres sans spécifier le codage, mais le spécifié peut également être BYTE [] bt = Encrypt (data.getBytes (UTF8), key.getBytes (UTF8)); // Remarque: Lors du chiffrement et du décryptage, utilisez Base64Encoder () de Sun pour l'encodage et le décodage, sinon il y aura du code brouillé.//i a visionné de nombreuses instances en ligne, mais il n'y a pas de codage et de décodage, et il n'y a pas de problème de code brouillé. J'ai un code brouillé ici, donc j'utilise Base64Encoder () pour le codage et le décodage String strS = new Base64Encoder (). Encoder (bt); retour des STR; } / ** * Description Decrypt en fonction de la valeur clé * @param data * @param key cryping key byte byte byte * @return * @throws ioexception * @throws exception * / public static string decrypt (string data, string key) lance ioException, exception {if (data == null) return null; // Remarque: Lors du chiffrement et du décryptage, utilisez Base64Encoder () de Sun pour le codage et le décodage, sinon il y aura un décodeur Base64Deccoder Base64Decoder = new Base64DecOder (); octet [] buf = decoder.decodeBuffer (données); octet [] bt = decrypt (buf, key.getBytes ()); return new String (bt, utf8); } / ** * Description Encrypt en fonction de la valeur clé * @param data * @param key crypt key byte array * @return * @throws exception * / private static byte [] Encrypt (byte [] data, byte [] key) lance l'exception {// générer un nombre de nombres aléatoires fiduciaires fiduciaires Srure Sr = new SeureRandom (); // Créer un objet DeskeySpec à partir des données de clé d'origine, c'est-à-dire le contenu clé de la clé qui crée la clé DeskeySpec DKS = new DeskeySpec (clé); // L'usine de clé est utilisée pour convertir la clé (clé de cryptage OPIC de la clé de type) en spécification clé (représentation transparente du matériau de clé sous-jacente), et vice versa. Secret Key Factory fonctionne uniquement sur des clés secrètes (symétriques). // Utilisez le mode singleton à la place ici // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance (DES); // Générez l'objet SecretKey (clé) en fonction de la spécification de clé fournie (matériau de clé). SecretKey SecureKey = KeyFactory.GenerateSeCret (DKS); // L'objet Cipher termine en fait l'opération de chiffrement, et cette classe fournit des fonctions de mot de passe pour le cryptage et le déchiffrement. Cipher Cipher = Cipher.getInstance (DES); // Initialisez ce chiffre avec une clé et une source aléatoire. Encrypt_Mode est utilisé pour initialiser le chiffrement en un mode constant pour le mode de chiffrement. cipher.init (cipher.encrypt_mode, SecureKey, sr); // Exécution formelle de l'opération de chiffrement Retour Cipher.Dofinal (données); } / ** * Description Decrypt en fonction de la valeur clé * @param data * @param key cryping key byte byte byte * @return * @throws exception * / private static byte [] décrypt (byte [] data, byte [] key) lance l'exception {// générer un nombre de nombres aléatoires fiduciaires fidèles Sr = new SeureRandom (); // Créer un objet DeskeySpec à partir des données de clé d'origine, c'est-à-dire le contenu clé de la clé qui crée la clé DeskeySpec DKS = new DeskeySpec (clé); // L'usine de clé est utilisée pour convertir la clé (clé de cryptage OPIC de la clé de type) en spécification de clé (représentation transparente du matériau de clé sous-jacente), et vice versa. Secret Key Factory fonctionne uniquement sur des clés secrètes (symétriques). // Utilisez le mode singleton à la place ici // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance (DES); // Générez l'objet SecretKey (clé) en fonction de la spécification de clé fournie (matériau de clé). SecretKey SecureKey = KeyFactory.GenerateSeCret (DKS); // La classe Cipher fournit des fonctions de mot de passe pour le cryptage et le décryptage. Cipher Cipher = Cipher.getInstance (DES); // DECRYPT_MODE est utilisé pour initialiser le chiffrement en une constante en mode de décryptage. cipher.init (cipher.decrypt_mode, SecureKey, SR); // Opération de décryptage formel Retour Cipher.Dofinal (données); }}2. Utilisez org.apache.commons.codec.binary.base64 pour décoder et encoder
Package com.soufun.com; Importer java.io.ioException; Importer java.security.nosuchalgorithMexception; import java.security.securerandom; import java.util.date; import javax.crypto.cipher; javax.crypto.spe.deskeyspec; import org.apache.commons.codec.binary.base64; / ** * @ auteur whd * * / public class Desutil {// définir la méthode d'encryption private finale statique de dessines = "des"; chaîne statique finale privée utf8 = "gbk"; STATIC SecretKeyFactory KeyFactory = NULL; static {try {keyfactory = SecretKeyFactory.getInstance ("DES"); } Catch (NosuchalgorithMexception e) {// Bloc de capture généré automatiquement de TODO E.PrintStackTrace (); }} public static void main (String [] args) lève une exception {long début = new Date (). GetTime (); String data = "Aaades Encryption Test"; // Remarque: Pendant le cryptage et le décryptage, la longueur de clé doit être des multiples de 8. String key = "qazwsXed"; System.err.println (Encrypt (données, clé)); System.err.println (Decrypt (Encrypt (données, clé), clé)); long fin = new Date (). getTime (); System.out.println (End-Begin); } / ** * Description Encrypt en fonction de la valeur clé * @param data * @param key cryption key byte array * @return * @throws exception * / public static String Encrypt (String data, string key) lève exception {// utilise l'encodage spécifié pour obtenir le contenu à crypter. Généralement, la clé est des lettres ou des nombres sans spécifier le codage, mais le spécifié peut également être byte [] bt = Encrypt (data.getBytes (utf8), key.getBytes ()); // Le premier utilise Sun.Misc.Base64Encoder; Il est codé, mais il est dit que l'utilisation d'org.apache.commons.codec.binary.base64 est meilleure, alors essayez String strs = base64.encodeBase64String (BT); retour des STR; } / ** * Description Decrypt en fonction de la valeur clé * @param data * @param key cryping key byte byte byte * @return * @throws ioexception * @throws exception * / public static string decrypt (string data, string key) lance ioException, exception {if (data == null) return null; // Utiliser org.apache.commons.codec.binary.base64 pour décoder byte [] buf = base64.decodeBase64 (données); octet [] bt = decrypt (buf, key.getBytes ()); return new String (bt, utf8); } / ** * Description Encrypt en fonction de la valeur clé * @param data * @param key cryping key byte array * @return * @throws exception * / private static byte [] crypt (byte [] data, byte [] key) lance exception {// générer un nombre de nombres aléatoires fiduciaires fidèles Srure Sr = new SeureRandom (); // Créer un objet DeskeySpec à partir des données de clé d'origine, c'est-à-dire le contenu clé de la clé qui crée la clé DeskeySpec DKS = new DeskeySpec (clé); // L'usine de clé est utilisée pour convertir la clé (clé de cryptage OPIC de la clé de type) en spécification de clé (représentation transparente du matériau de clé sous-jacente), et vice versa. Secret Key Factory fonctionne uniquement sur des clés secrètes (symétriques). // Utilisez le mode singleton à la place ici // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance (DES); // Générez l'objet SecretKey (clé) en fonction de la spécification de clé fournie (matériau de clé). SecretKey SecureKey = KeyFactory.GenerateSeCret (DKS); // L'objet Cipher termine en fait l'opération de chiffrement, et cette classe fournit des fonctions de mot de passe pour le cryptage et le déchiffrement. Cipher Cipher = Cipher.getInstance (DES); // Initialisez ce chiffre avec une clé et une source aléatoire. Encrypt_Mode est utilisé pour initialiser le chiffrement en un mode constant pour le mode de chiffrement. cipher.init (cipher.encrypt_mode, SecureKey, sr); // Exécution formelle de l'opération de chiffrement Retour Cipher.Dofinal (données); } / ** * Description Decrypt en fonction de la valeur clé * @param data * @param key cryping key byte byte byte * @return * @throws exception * / private static byte [] décrypt (byte [] data, byte [] key) lance l'exception {// générer un nombre de nombres aléatoires fiduciaires fidèles Sr = new SeureRandom (); // Créer un objet DeskeySpec à partir des données de clé d'origine, c'est-à-dire le contenu clé de la clé qui crée la clé DeskeySpec DKS = new DeskeySpec (clé); // L'usine de clé est utilisée pour convertir la clé (clé de cryptage OPIC de la clé de type) en spécification de clé (représentation transparente du matériau de clé sous-jacente), et vice versa. Secret Key Factory fonctionne uniquement sur des clés secrètes (symétriques). // Utilisez le mode singleton à la place ici // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance (DES); // Générez l'objet SecretKey (clé) en fonction de la spécification de clé fournie (matériau de clé). SecretKey SecureKey = KeyFactory.GenerateSeCret (DKS); // La classe Cipher fournit des fonctions de mot de passe pour le cryptage et le décryptage. Cipher Cipher = Cipher.getInstance (DES); // DECRYPT_MODE est utilisé pour initialiser le chiffrement en une constante en mode de décryptage. cipher.init (cipher.decrypt_mode, SecureKey, SR); // Opération de décryptage formel Retour Cipher.Dofinal (données); }}Téléchargez l'adresse du package utilisé en 1 et 2:
Télécharger: Sun.Misc.Base64Decoder.
Télécharger: Encodage de base64 d'Apache, Decoder.
3. Aucun encodage n'est utilisé, package de décodage
package com.soufun.com; import java.io.ioexception; import java.security.nosuchalgorithmexception; import java.util.date; import java.util.hashmap; import java.util.map; javax.crypto.secretKeyFactory; import javax.crypto.spec.deskeyspec; import javax.crypto.spe.ivParameterspec; / ** * @ auteur whd * * / public class decrypt {static secrekfactory secretkeyfactory = null; // Cipher "Algorithm / motif / remplissage" Statique finale statique cipher = "DES / CBC / PKCS5PADDING"; statique {try {// Obtenez le projet de clé secrète SecretKeyFactory = SecretKeyFactory.getInstance ("DES"); } catch (NosuchalgorithMexception e) {e.printStackTrace (); }} // Définir les constantes, format de codage à la chaîne finale statique privée utf8 = "gbk"; / * * Conteneur pour le cache d'objet * / classe abstraite statique cache {carte finale privée innercache = new hashmap (); Résumé protégée Création d'objets (clé d'objet) lance une exception; public objet get (touche objet) lève l'exception {Valeur d'objet; synchronisé (innerCache) {value = innercache.get (key); if (value == null) {value = new CreationPlaceHolder (); innercache.put (clé, valeur); }} if (valeur de valeur de CreationPlaceHolder) {synchronisé (valeur) {CreationPlaceHolder Progress = (CreationPlaceHolder); if (progress.value == null) {progress.value = createValue (key); synchronisé (innercache) {innercache.put (key, progress.value); }} return progress.value; }} valeur de retour; } Création de classe finale statique CréationPlaceHolder {Valeur d'objet; }} / * * hex-> str & str-> hex * / public static byte [] stringToHex (String ss) {// Conversion de chaîne we byte digest [] = new byte [ss.length () / 2]; for (int i = 0; i <digest.length; i ++) {String byTestring = ss.substring (2 * i, 2 * i + 2); int bytevalue = Integer.ParseInt (byTestring, 16); digest [i] = (octet) bytevalue; } return digest; } public static String hextoString (byte b []) {StringBuffer hexString = new StringBuffer (); for (int i = 0; i <b.length; i ++) {String PlainText = Integer.tohexString (0xff & b [i]); if (plaintext.length () <2) {hexString.append ("0"); } hexstring.append (PlainText); } return hexstring.toString (); } octet statique privé [] _ConvertKeIV (Texte de chaîne) lève ioException {if (text.length () == 8) {return text.getBytes (utf8); } if (text.startswith ("0x") && text.length () == 32) {byte [] result = new Byte [8]; pour (int i = 0; i <text.length (); i + = 2) {if (text.charat (i ++) == '0' && text.charat (i ++) == 'x') {try {result [i / 4] = (byte) Integer.Parseint (text.subString (i, i + 2), 16); } catch (exception e) {throw new ioException ("txt '" + text + "' est invalide!"); }}} Retour Résultat; } Jetez une nouvelle ioException ("txt '" + texte + "' est invalide!"); } / * * SecretKey & IvParameterspec's Cache * / Private Static Cache SecretKeySpecs = new Cache () {Protected Object CreateEvalue (Object Key) exception {SecretKey SecretKeyObj = NULL; essayez {SecretKeyObj = SecretKeyFactory.GenerateSeCret (new DeskeySpec (_ConvertKeyIv ((String) Key))); } catch (exception e) {e.printStackTrace (); } return SecretKeyObj; }}; cache statique privé ivParamSpecs = new cache () {objet protégé CreateEvalue (clé d'objet) lance l'exception {ivParameterspec ivobj = null; ivobj = new ivParameterspec (_ConvertKeIV ((string) key)); retour ivobj; }}; / * * Encryption & Decryption * / public static String Encrypt (String Text, String AuthKey, String authiv) {SecretKey SecretKeyObj = null; IvParameterspec ivobj = null; Essayez {SecretKeyObj = (SecretKey) SecretKeyspecs.get (AuthKey); ivobj = (ivParameterspec) ivParamSpecs.get (authiv); } catch (exception e) {e.printStackTrace (); } octet [] data = null; try {data = text.getBytes (utf8); } catch (exception e) {e.printStackTrace (); } octet [] authtoken = null; essayez {authToken = Encrypt (data, secrétyyobj, ivobj); } catch (exception e) {e.printStackTrace (); } return hextoString (authtoken); } octet statique public [] Encrypt (octet [] données, SecretKey SecretKey, ivParameterspec IV) lève une exception {Cipher cipher = cipher.getInstance (Cipher); cipher.init (cipher.encpt_mode, SecretKey, iv); return cipher.dofinal (données); } Public Static String Decrypt (String hexString, String AuthKey, String AuthIv) lève une exception {SecretKey SecretKeyObj = null; IvParameterspec ivobj = null; Essayez {SecretKeyObj = (SecretKey) SecretKeyspecs.get (AuthKey); ivobj = (ivParameterspec) ivParamSpecs.get (authiv); } catch (exception e) {e.printStackTrace (); } String text = Decrypt (Hexstring, SecretKeyObj, ivobj); Retour Texte; } Public Static String Decrypt (Message de chaîne, SecretKey SecretKey, ivParameterspec IV) lève une exception {BYTE [] data = stringToHex (message); Retour Decrypt (Data, SecretKey, IV); } Décrypt de chaîne statique publique (Données Byte [], SecretKey SecretKey, IvParameterspec IV) lève une exception {Cipher Cipher = Cipher.getInstance (Cipher); cipher.init (cipher.decrypt_mode, SecretKey, iv); octet [] retbyte = cipher.dofinal (données); return new String (retbyte); } public static void main (string [] args) lève une exception {long begin = new Date (). getTime (); String authKey = "W8f3k9c2"; String authiv = "W8f3K9C2"; String text = "Aaades Encryption Test"; // 140cb412ba03869f // 140cb412ba03869f // Encrypt la chaîne de texte originale EncryptedText = Encrypt (texte, authkey, authiv); System.out.println ("EncryptedText:" + EncryptedText); // Restaurer la chaîne CipherText PlainText = Decrypt (EncryptedText, AuthKey, AuthIv); System.out.println ("PlainText:" + PlainText); // 2A329740CE15F549BE64190B183A5BE2 Long End = new Date (). GetTime (); System.out.println (End-Begin); }}PS: Les amis qui sont intéressés par le cryptage et le décryptage peuvent également se référer aux outils en ligne de ce site:
Détection en ligne de sécurité de mot de passe:
http://tools.vevb.com/password/my_password_safe
Générateur de mots de passe à haute résistance:
http://tools.vevb.com/password/createstrongpassword
Outils de chiffrement / décryptage des URL express et express et de tornade:
http://tools.vevb.com/password/urlrethunder
Outil de chiffrement en ligne de hachage / hachage de hachage:
http://tools.vevb.com/password/hash_encrypt
MD5 / HASH / SHA-1 / SHA-2 / SHA-256 / SHA-512 / SHA-3 / RIMEMD-160 Tool:
http://tools.vevb.com/password/hash_md5_sha
En ligne SHA1 / SHA224 / SHA256 / SHA384 / SHA512 Outil de cryptage:
http://tools.vevb.com/password/sha_encode
J'espère que cet article sera utile à la programmation Java de tous.