Este artículo describe las funciones de cifrado y descifrado implementadas por Java basadas en el algoritmo de cifrado simétrico de DES. Compártelo para su referencia, como sigue:
Categorías relacionadas con el cifrado DES:
Securerandom se hereda de la clase Java.util.random
Hay tres tipos de constructores de esta clase, los siguientes son dos ejemplos:
SecureRandom () construye un generador de números aleatorios seguros (RNG) que implementa el algoritmo de número aleatorio predeterminado.
Secureandom (Byte [] semilla) construye un generador de números aleatorios seguros (RNG) que implementa el algoritmo de número aleatorio predeterminado.
DeskeySPEC se usa para generar el contenido clave de la clave utilizando la tecla original.
Deskeyspec tiene dos constructores:
DeskeySpec (Byte [] Key) crea un objeto DeskeysPec usando los primeros 8 bytes en la clave como el contenido de la clave de la tecla DES.
DeskeySpec (byte [] key, int offset) crea un objeto DeskeySPEC, usando los primeros 8 bytes en la clave que comienza y contiene compensación como el contenido clave de la tecla Des-Edede.
SecretKeyFactory, una fábrica de clave utilizada para convertir una clave (clave de cifrado OPIC de clave de tipo) a una especificación de clave (representación transparente del material de clave subyacente) y viceversa. Secret Key Factory opera solo en claves secretas (simétricas).
SecretKey Object, Secret Key Object, genera una clave secreta llamando al método GeneratedSecret (deskeyspec de escritorio de escritorio) de la fábrica de teclas secretas
La clase Cipher proporciona funciones de contraseña para el cifrado y el descifrado, y obtiene instancias llamando a Cipher's GetInstance ("DES")
El objeto cifrado llama al método init () para inicializar el objeto. Los parámetros específicos del método init () se determinan de acuerdo con la situación específica, incluidas las constantes encriptadas y descifradas.
Finalmente, llame al método dofinal () de cifrado para el cifrado y el descifrado.
Aquí me gustaría hacerte una pregunta. Ya sea el primer tipo de codificación usando Base64Encoder o el segundo tipo de org.apache.commons.codec.binary.base64 codificación, al convertir la cadena en byte y byte a cadena, UTF-8/GBK y otras codificaciones deben codificar. ¿Está decodificado?
1. Use Sun.Misc.Base64Decoder y Base64Encoder para decodificar y codificar
paquete com.soufun.com; import java.io.ioexception; import java.security.nosuchalgorithmexception; import java.security.secureerandom; import java.util.date; import javax.crypto.cipher; import javax.crypto.secretkey; import javax.cryfactory; javax.crypto.spec.deskeyspec; // Importar codificación de 64 bits de Sun Importación Sun.Misc.Base64Decoder; Importar Sun.Misc.Base64Encoder;/** *@Author WHD * *Encoder En este momento, puede eliminar su paquete JRE e importarlo nuevamente. */public class desutil {// Definir método de cifrado String estático final des = "des"; cadena estática final privada utf8 = "gbk"; static SecretKeyFactory keyFactory = null; static {try {keyFactory = SecretKeyFactory.getInstance ("des"); } Catch (nosuchalgorithMexception e) {// TODO BLOQUE DE CABTA AUTO GENERADA E.PRINTSTACKTRACE (); }} public static void main (string [] args) lanza la excepción {long begin = new Date (). GetTime (); String data = "prueba de cifrado aaades"; // NOTA: Durante el proceso de cifrado y descifrado de DES, la longitud de la clave debe ser un múltiplo de 8. Key de cadena = "Qazwsxed"; System.err.println (CiCrypt (Data, Key)); System.err.println (Decrypt (CiCrypt (Data, Key), Key)); Long End = New Date (). GetTime (); System.out.println (final de Begin); } / ** * Descripción Cifres de acuerdo con el valor de clave * @param Data * @param Cifrado de cifrado Clave Byte Array * @return * @throws Exception * / public static String CiCrypt (Data de cadena, tecla de cadena) arroja excepción {// Use la codificación especificada para obtener el contenido que se encriptará. En general, la clave secreta son letras o números sin especificar la codificación, pero la especificación también puede ser byte [] bt = encrypt (data.getBytes (UTF8), key.getBytes (UTF8)); // NOTA: Al encriptar y descifrar, use Sun's Base64Encoder () para codificar y decodificar, de lo contrario habrá código confundido .///i ha visto muchas instancias en línea, pero no hay codificación y decodificación, y se dice que no hay problema de código confundido. Tengo código confuso aquí, así que uso base64Encoder () para codificar y decodificar cadena Strs = new Base64Encoder (). Code (BT); devolver STRS; } / ** * Descripción Decrypt de acuerdo con el valor de clave * @param Data * @param Cifrado de cifrado Clave Matray * @return * @throws ioexception * @throws Exception * / public static String Decrypt (Data de cadena, tecla de cadena) lanza IOException, Exception {if (data == null) return null; // Nota: Al encriptar y descifrar, use Sun's Base64Encoder () para codificar y decodificar, de lo contrario habrá Garled Base64Decoder Decoder = new Base64Decoder (); byte [] buf = decoder.decodeBuffer (datos); byte [] bt = Decrypt (buf, key.getBytes ()); devolver nueva cadena (BT, UTF8); } / ** * Descripción CIRRY Según el valor de clave * @param data * @param CiCrypt Key Byte Array * @return * @throws Exception * / private static byte [] encrypt (byte [] data, byte [] key) lanza la excepción {// Generar una fuente de número aleatoria confiable SecurerAndom sr = new Surandom (); // Cree un objeto DeskeySPEC a partir de los datos clave originales, es decir, el contenido clave de la clave que crea la clave deskeyspec dks = new DesKEYSPEC (clave); // La fábrica de teclas se usa para convertir la clave (clave de cifrado OPIC de la tecla de tipo de tipo) a la especificación de la clave (representación transparente del material de clave subyacente) y viceversa. Secret Key Factory opera solo en claves secretas (simétricas). // use el modo Singleton en su lugar aquí // SecretKeyFactory KeyFactory = SecretKeyFactory.getInstance (DES); // Generar el objeto SecretKey (clave) de acuerdo con la especificación de clave proporcionada (material clave). SecretKey SecureKey = KeyFactory.GeneratesECret (DKS); // El objeto CIPHER realmente completa la operación de cifrado, y esta clase proporciona funciones de contraseña para el cifrado y el descifrado. Cifrado cifrado = cifrado.getInstance (des); // Inicializa este cifrado con una clave y una fuente aleatoria. CiCryPT_Mode se usa para inicializar el cifrado en una constante para el modo de cifrado. cipher.init (cipher.encrypt_mode, securekey, sr); // Ejecución formal de la operación de cifrado return cifre.dofinal (datos); } / ** * Descripción Decrypt de acuerdo con el valor de la clave * @param Data * @param Cifrado de cifrado Byte Array * @return * @throws Exception * / private static byte [] Decrypt (byte [] data, byte [] key) lanza la excepción {// Generar una fuente de número aleatoria confiable SecurerAndom sr = new Surandom (); // Cree un objeto DeskeySPEC a partir de los datos clave originales, es decir, el contenido clave de la clave que crea la clave deskeyspec dks = new DesKEYSPEC (clave); // La fábrica de teclas se usa para convertir la clave (clave de cifrado OPIC de la tecla de tipo de tipo) a la especificación de la clave (representación transparente del material de clave subyacente) y viceversa. Secret Key Factory opera solo en claves secretas (simétricas). // use el modo Singleton en su lugar aquí // SecretKeyFactory KeyFactory = SecretKeyFactory.getInstance (DES); // Generar el objeto SecretKey (clave) de acuerdo con la especificación de clave proporcionada (material clave). SecretKey SecureKey = KeyFactory.GeneratesECret (DKS); // La clase CIPHER proporciona funciones de contraseña para cifrado y descifrado. Cifrado cifrado = cifrado.getInstance (des); // Decrypt_mode se usa para inicializar el cifrado en una constante en el modo de descifrado. cipher.init (cipher.decrypt_mode, securekey, sr); // Operación de descifrado formal de retorno CIPHER.dofinal (datos); }}2. Use org.apache.commons.codec.binary.base64 para decodificar y codificar
paquete com.soufun.com; import java.io.ioexception; import java.security.nosuchalgorithmexception; import java.security.secureerandom; import java.util.date; import javax.crypto.cipher; import javax.crypto.secretkey; import javax.cryfactory; javax.crypto.spec.deskeyspec; import org.apache.commons.codec.binary.base64;/** *@autor whd * */public class desutil {// Definir método de cifrado String static final privado des = "des"; cadena estática final privada utf8 = "gbk"; static SecretKeyFactory keyFactory = null; static {try {keyFactory = SecretKeyFactory.getInstance ("des"); } Catch (nosuchalgorithMexception e) {// TODO BLOQUE DE CABTA AUTO GENERADA E.PRINTSTACKTRACE (); }} public static void main (string [] args) lanza la excepción {long begin = new Date (). GetTime (); String data = "prueba de cifrado aaades"; // Nota: Durante el proceso de cifrado y descifrado de DES, la longitud de la clave debe ser múltiplos de 8. Cadena clave = "Qazwsxed"; System.err.println (CiCrypt (Data, Key)); System.err.println (Decrypt (CiCrypt (Data, Key), Key)); Long End = New Date (). GetTime (); System.out.println (final de Begin); } / ** * Descripción CIRRY Según el valor de clave * @param Data * @param Cifrado de cifrado Clave Array * @return * @throws Exception * / public static String CiCrypt (Data de cadena, clave de cadena) Excepción {// Use la codificación especificada para obtener el contenido para estar encriptado. En general, la clave son letras o números sin especificar la codificación, pero la especificada también puede ser byte [] bt = encrypt (data.getBytes (UTF8), key.getBytes ()); // El primero usa sun.misc.base64Encoder; Está codificado, pero se dice que usar org.apache.commons.codec.binary.base64 es mejor, así que intente strs strs = base64.encodebase64String (bt); devolver STRS; } / ** * Descripción Decrypt de acuerdo con el valor de clave * @param Data * @param Cifrado de cifrado Key Array * @return * @throws ioException * @throws Exception * / public static String Decrypt (Data String Data, String Key) lanza IoException, Exception {if (data == null) return null; // use org.apache.commons.codec.binary.base64 para decodificar byte [] buf = base64.decodebase64 (datos); byte [] bt = Decrypt (buf, key.getBytes ()); devolver nueva cadena (BT, UTF8); } / ** * Descripción Encrypt de acuerdo con el valor de la clave * @param data * @param Cifrado de cifrado Clave Byte Array * @return * @throws Exception * / private static byte [] encrypt (byte [] data, byte [] key) lanza la excepción {// Generar una fuente de número aleatoria confiable SecurerAndom sr = new Surandom (); // Cree un objeto DeskeySPEC a partir de los datos clave originales, es decir, el contenido clave de la clave que crea la clave deskeyspec dks = new DesKEYSPEC (clave); // La fábrica de teclas se usa para convertir la clave (clave de cifrado OPIC de la tecla de tipo de tipo) a la especificación de la clave (representación transparente del material de clave subyacente) y viceversa. Secret Key Factory opera solo en claves secretas (simétricas). // use el modo Singleton en su lugar aquí // SecretKeyFactory KeyFactory = SecretKeyFactory.getInstance (DES); // Generar el objeto SecretKey (clave) de acuerdo con la especificación de clave proporcionada (material clave). SecretKey SecureKey = KeyFactory.GeneratesECret (DKS); // El objeto CIPHER realmente completa la operación de cifrado, y esta clase proporciona funciones de contraseña para el cifrado y el descifrado. Cifrado cifrado = cifrado.getInstance (des); // Inicializa este cifrado con una clave y una fuente aleatoria. CiCryPT_Mode se usa para inicializar el cifrado en una constante para el modo de cifrado. cipher.init (cipher.encrypt_mode, securekey, sr); // Ejecución formal de la operación de cifrado return cipher.dofinal (datos); } / ** * Descripción Decrypt de acuerdo con el valor de la clave * @param Data * @param Cifrado de cifrado Byte Array * @return * @throws Exception * / private static byte [] Decrypt (byte [] data, byte [] key) lanza la excepción {// Generar una fuente de número aleatoria confiable SecurerAndom sr = new Surandom (); // Cree un objeto DeskeySPEC a partir de los datos clave originales, es decir, el contenido clave de la clave que crea la clave deskeyspec dks = new DesKEYSPEC (clave); // La fábrica de teclas se usa para convertir la clave (clave de cifrado OPIC de la tecla de tipo de tipo) a la especificación de la clave (representación transparente del material de clave subyacente) y viceversa. Secret Key Factory opera solo en claves secretas (simétricas). // use el modo Singleton en su lugar aquí // SecretKeyFactory KeyFactory = SecretKeyFactory.getInstance (DES); // Generar el objeto SecretKey (clave) de acuerdo con la especificación de clave proporcionada (material clave). SecretKey SecureKey = KeyFactory.GeneratesECret (DKS); // La clase CIPHER proporciona funciones de contraseña para cifrado y descifrado. Cifrado cifrado = cifrado.getInstance (des); // Decrypt_mode se usa para inicializar el cifrado en una constante en el modo de descifrado. cipher.init (cipher.decrypt_mode, securekey, sr); // Operación de descifrado formal de retorno CIPHER.dofinal (datos); }}Descargar dirección del paquete utilizado en 1 y 2:
Descargar: Sun.Misc.Base64Decoder.
Descargar: Codificación Base64 de Apache, decodificador.
3. No se usa la codificación, paquete de decodificación
paquete com.soufun.com; import java.io.ioexception; import java.security.nosuchalgorithmexception; import java.util.date; import java.util.hashmap; import java.util.map; import javax.crypto.cipher; import javax.crypto.secretkey; import; importar; importar; import javax.crypto.secretkeyFactory; import javax.crypto.spec.deskeyspec; import javax.crypto.spec.ivparameterspec;/** *@autor whd * */public class Descrypt {SecretKeyFactory static SecretKeyFactory = null; // "Algoritmo/Pattern/Filling" estático "CIPHER CIPHER =" DES/CBC/PKCS5PADDING "; static {try {// Obtener el proyecto de clave secreta secretKeyFactory = SecretKeyFactory.getInstance ("des"); } Catch (nosuchalgorithMexception e) {E.PrintStackTrace (); }} // Definir constantes, formato de codificación de cadena final estática privada utf8 = "gbk"; /** Container para caché de objetos*/ Cache de clase abstracta estática {mapa final privado innerCache = new HashMap (); Objeto abstracto protegido createValue (clave de objeto) arroja excepción; Public Object get (Key de objeto) lanza la excepción {valor de objeto; sincronizado (innerCache) {value = innerCache.get (key); if (value == null) {value = new CreationPlaceHolder (); innerCache.put (clave, valor); }} if (valor de valor de CreationPlaceHolder) {sincronizado (valor) {CreationPlaceHolder Progress = (CreationPlaceHolder) Value; if (progreso.value == null) {progress.value = createValue (key); sincronizado (innerCache) {innerCache.put (Key, Progress.Value); }} return progress.Value; }} Valor de retorno; } Class de creación de clase final estática {valor de objeto; }} / * * hex-> str & str-> hex * / public static byte [] stringToHex (String ss) {// String Conversion 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] = (byte) bytevalue; } return digest; } public static String HexToString (byte b []) {StringBuffer hexString = new StringBuffer (); for (int i = 0; i <b.length; i ++) {string Entenerxt = integer.toHexString (0xff & b [i]); if (asignext.length () <2) {hexString.append ("0"); } hexString.append (Teñir texto); } return hexString.ToString (); } byte estático privado [] _convertkeyiv (texto de cadena) lanza ioexception {if (text.length () == 8) {return text.getBytes (utf8); } if (text.startswith ("0x") && text.length () == 32) {byte [] resultado = nuevo byte [8]; for (int i = 0; i <text.length (); i+= 2) {if (text.charat (i ++) == '0' && text.charat (i ++) == 'x') {try {resultado [i / 4] = (byte) enterg.parseint (text.substring (i, i+2), 16); } Catch (Exception e) {tire nueva IOException ("txt '" + text + "' no es válido!"); }}} Resultado de retorno; } tirar nueva ioexception ("txt '" + text + "' no es válido!"); } /** SecretKey & IvParameterspec's Cache* / private Static Cache SecretKeySpecs = new Cache () {Protected Object CreateValue (clave de objeto) lanza la excepción {SecretKey SecretKeyObj = null; Pruebe {SecretKeyObj = SecretKeyFactory.GeneratesECret (nuevo DeskeySPEC (_ConvertKeyiv ((String) Key))); } catch (Exception e) {E.PrintStackTrace (); } return SecretKeyObj; }}; Cache estático privado ivParamSpecs = new Cache () {Protected Object CreateValue (Key de objeto) lanza la excepción {ivParamETERSPEC IVOBJ = NULL; IVOBJ = nuevo IVParamETERSPEC (_convertkeyiv ((string) key)); regresar Ivobj; }}; /** Cifrado y descifrado*/ public static String CiCrypt (String Text, String AuthKey, String Authiv) {SecretKey SecretKeyObj = null; IvParameterspec Ivobj = null; intente {SecretKeyObj = (SecretKey) SecretKeySpecs.get (Authey); IVOBJ = (IVPARAMETERSPEC) IVPARAMSPECS.GET (AUTHIV); } catch (Exception e) {E.PrintStackTrace (); } byte [] data = null; intente {data = text.getBytes (UTF8); } catch (Exception e) {E.PrintStackTrace (); } byte [] authToken = null; intente {authToken = encrypt (data, SecretKeyObj, Ivobj); } catch (Exception e) {E.PrintStackTrace (); } return hexToString (authToken); } public static byte [] encrypt (byte [] data, SecretKey SecretKey, ivParameterspec IV) arroja excepción {cifrado cifrado = cifrado.getInstance (cifrado); cipher.init (cipher.encrypt_mode, secretkey, iv); return cipher.dofinal (datos); } public static String Decrypt (String HexString, String AuthKey, String Authiv) arroja excepción {SecretKey SecretKeyObj = null; IvParameterspec Ivobj = null; intente {SecretKeyObj = (SecretKey) SecretKeySpecs.get (Authey); IVOBJ = (IVPARAMETERSPEC) IVPARAMSPECS.GET (AUTHIV); } catch (Exception e) {E.PrintStackTrace (); } String text = Decrypt (HexString, SecretKeyObj, Ivobj); Texto de devolución; } public static String Decrypt (Mensaje de cadena, SecretKey SecretKey, IVParameterspec IV) lanza la excepción {byte [] data = stringToHex (mensaje); return Decrypt (datos, SecretKey, IV); } public static string Decrypt (byte [] data, SecretKey SecretKey, ivParameterspec IV) lanza la excepción {cifrado cifrado = cipher.getInstance (cifrado); cipher.init (cipher.decrypt_mode, secretkey, iv); byte [] retbyte = cipher.dofinal (datos); devolver nueva cadena (retbyte); } public static void main (string [] args) lanza la excepción {long begin = new Date (). GetTime (); Cadena authKey = "w8f3k9c2"; Cadena Authiv = "W8F3K9C2"; String text = "prueba de cifrado aaades"; // 140CB412BA03869F // 140CB412BA03869F // CIRRY La cadena de texto original CiCrypTedText = CiCrypt (Text, AuthKey, AuthKey, AuthEd); System.out.println ("CiRyPtedText:" + CiCryPtedText); // restaurar la cadena de texto cifrado Entraintex = Decrypt (CiCryPtedText, AuthKey, Authiv); System.out.println ("Ensxt Teñing:" + Textext); // 2A329740CE15F549BE64190B183A5BE2 Long End = New Date (). GetTime (); System.out.println (final de Begin); }}PD: Los amigos interesados en el cifrado y el descifrado también pueden referirse a las herramientas en línea de este sitio:
Detección en línea de seguridad de la contraseña:
http://tools.vevb.com/password/my_password_safe
Generador de contraseñas de alta resistencia:
http://tools.vevb.com/password/createstrontepassword
Herramientas de cifrado/descifrado de URL de Thunder, Express y Tornado:
http://tools.vevb.com/password/urlrethunder
Herramienta de cifrado de algoritmo de hash/hash en línea:
http://tools.vevb.com/password/hash_encrypt
MD5 en línea/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160 herramienta de cifrado:
http://tools.vevb.com/password/hash_md5_sha
En línea SHA1/SHA224/SHA256/SHA384/SHA512 Herramienta de cifrado:
http://tools.vevb.com/password/sha_encode
Espero que este artículo sea útil para la programación Java de todos.