El algoritmo de cifrado simétrico es un algoritmo de cifrado anterior con tecnología madura. En el algoritmo de cifrado simétrico, el remitente de datos procesa el texto sin formato (datos originales) y la clave de cifrado (mi yue) junto con un algoritmo de cifrado especial, convirtiéndolos en texto cifrado cifrado complejo y enviándolos. Después de que el destinatario recibe el texto cifrado, si quiere descifrar el texto original, necesita usar la clave utilizada para el cifrado y el algoritmo inverso del mismo algoritmo para descifrar el texto cifrado y restaurarlo a texto sin formato legible. En el algoritmo de cifrado simétrico, solo se utiliza una clave. Tanto el remitente como el receptor utilizan esta clave para cifrar y descifrar los datos. Esto requiere que el descifrador conozca la clave de cifrado de antemano.
Los algoritmos de cifrado simples de Java son:
BASE estrictamente hablando es un formato de codificación, no un algoritmo de cifrado
MD (algoritmo de resumen de mensajes, algoritmo de resumen de mensajes)
SHA (Algoritmo Hash Seguro, algoritmo hash seguro)
HMAC (Código de autenticación de mensaje hash, código de autenticación de mensaje hash)
Tipo 1. BASE
Base es uno de los métodos de codificación más comunes para transmitir códigos de bytes en Internet. Puede ver RFC ~ RFC, que tiene especificaciones detalladas para MIME. La codificación base se puede utilizar para transmitir información de identificación más larga en un entorno HTTP. Por ejemplo, en el sistema Java Persistence Hibernate, Base se usa para codificar un identificador único largo (generalmente un UUID de bits) en una cadena, que se usa como parámetros en formularios HTTP y URL GET HTTP. En otras aplicaciones, a menudo es necesario codificar datos binarios en un formato adecuado para colocarlos en una URL (incluidos los campos de formulario ocultos). En este momento, la codificación Base es ilegible, es decir, los datos codificados no serán directamente visibles a simple vista. (Fuente: Enciclopedia Baidu)
código de implementación de Java:
paquete com.cn. Cifrado unidireccional; import sun.misc.BASEDecoder; import sun.misc.BASEEncoder;/* El cifrado y descifrado BASE son bidireccionales, y se pueden encontrar soluciones inversas para BASEEncoder y BASEDecoder. clases. Aunque se puede encontrar y utilizar en el JDK, no se puede encontrar en la API. Las clases que comienzan con sun y com.sun en JRE no están documentadas. Pertenecen a la base de las bibliotecas de clases java y javax. La mayoría de sus implementaciones están relacionadas con la plataforma subyacente y generalmente no se recomiendan. Estrictamente hablando, BASE es un formato de codificación, mientras que los algoritmos sin cifrado incluyen principalmente las dos clases BASEEncoder y BASEDecoder. Solo necesitamos saber cómo utilizar los métodos correspondientes. Además, el número de bytes generados después del cifrado BASE es múltiplo de . Si el número de bytes es insuficiente, rellénelo con el símbolo =. BASE Según la definición de RFC, Base se define como: La codificación de transferencia de contenido base está diseñada para describir cualquier secuencia de bits en una forma que los humanos no puedan reconocer fácilmente directamente. (La codificación de transferencia de contenido base está diseñada para representar secuencias arbitrarias de octetos en una forma que no necesita ser legible por humanos). Se ve comúnmente en correos electrónicos y cifrado http. Al interceptar información http, encontrará los campos de nombre de usuario y contraseña para iniciar sesión. Operaciones cifradas vía BASE. */public class BASE { /** * descifrado BASE* * @param key * @return * @throws Exception */ public static byte[] decryptBASE(String key) throws Exception { return (new BASEDecoder()).decodeBuffer(key } /** * Cifrado BASE* * @param key * @return * @throws Exception */ public static String encryptBASE(byte[] key) lanza una excepción { return (new BASEEncoder()).encodeBuffer(key); } public static void main(String[] args) { String str=""; intentar { String result= BASE.encryptBASE(str.getBytes()); out.println("resultado=====datos cifrados=========="+resultado de bytes[]= BASE.decryptBASE(resultado); str=new String(resultado); System.out.println("str========Datos descifrados========"+str } catch (Excepción e) { e.printStackTrace( ); } }}
Segundo tipo.
MD es un algoritmo de resumen de mensajes (algoritmo de resumen de mensajes), que se utiliza para garantizar una transmisión de información completa y consistente. Es uno de los algoritmos hash más utilizados en las computadoras (también traducido como algoritmo de resumen y algoritmo hash MD que se ha implementado generalmente en los principales lenguajes de programación). Computar datos (como caracteres chinos) en otro valor de longitud fija es el principio básico del algoritmo hash. Los predecesores de MD son MD, MD y MD. Ampliamente utilizado en tecnología de cifrado y descifrado, a menudo utilizado para la verificación de archivos. ¿controlar? No importa qué tan grande sea el archivo, se puede generar un valor MD único después de MD. Por ejemplo, la calibración ISO actual es la calibración MD. ¿Cómo usarlo? Por supuesto, el valor MD se genera después de que ISO pasa a través de MD. Generalmente, los amigos que han descargado Linux-ISO han visto la cadena MD junto al enlace de descarga. Se utiliza para verificar si los archivos son consistentes.
implementación de java:
paquete com.cn. Cifrado unidireccional; import java.math.BigInteger; import java.security.MessageDigest;/*MD (algoritmo de resumen de mensajes, algoritmo de resumen de mensajes) Por lo general, no utilizamos directamente el cifrado MD anterior. Por lo general, la matriz de bytes generada por MD se entrega a BASE y luego se cifra para obtener el resumen de cadena correspondiente: ensamblador*/public class MD { public static final String KEY_MD = "MD" public static String getResult(String inputStr) { System .out.println("========Datos antes del cifrado:"+inputStr bigInteger=null intente { MessageDigest md =); MessageDigest.getInstance(KEY_MD); byte[] inputData = inputStr.getBytes(); md.update(inputData); bigInteger = new BigInteger(md.digest() } catch (Excepción e) {e.printStackTrace(); } System.out.println("Después del cifrado MD:" + bigInteger.toString()); bigInteger.toString(); } public static void main(String args[]) { try { String inputStr = "Cifrado simple"; getResult(inputStr } catch (Exception e) { e.printStackTrace();
El algoritmo MD tiene las siguientes características:
Compresibilidad: para datos de cualquier longitud, la longitud del valor MD calculado es fija.
, Fácil de calcular: es fácil calcular el valor MD a partir de los datos originales.
Resistencia a la modificación: si se realizan cambios en los datos originales, incluso si solo se modifica un byte, el valor MD resultante será muy diferente.
, Anticolisión débil: conociendo los datos originales y su valor MD, es muy difícil encontrar datos con el mismo valor MD (es decir, datos falsificados).
, Fuerte anticolisión: es muy difícil encontrar dos datos diferentes para que tengan el mismo valor MD.
La función de MD es permitir "comprimir" información de gran capacidad en un formato confidencial (es decir, convertir una cadena de bytes de cualquier longitud en una cadena de dígitos hexadecimales de cierta longitud) antes de firmar la clave privada con digital. software de firma. Además de MD, los más famosos incluyen sha-, RIPEMD y Haval.
El tercer tipo.SHA
El algoritmo Hash seguro se aplica principalmente al algoritmo de firma digital DSA definido en el estándar de firma digital DSS. Para mensajes de menos de ^ bits de longitud, SHA produce un resumen de mensaje de un bit. Este algoritmo ha sido desarrollado y mejorado por expertos en cifrado a lo largo de los años y se ha perfeccionado y utilizado cada vez más. La idea de este algoritmo es recibir un fragmento de texto sin formato y luego convertirlo en un fragmento de texto cifrado (generalmente más pequeño) de forma irreversible. También puede entenderse simplemente como tomar una cadena de códigos de entrada (llamado mapeo previo). o información), y El proceso de convertirlos en una secuencia de salida corta de dígitos fijos, es decir, un valor hash (también llamado resumen de mensaje o código de autenticación de mensaje). Se puede decir que el valor de la función hash es una "huella digital" o un "resumen" del texto sin formato, por lo que la firma digital del valor hash puede considerarse como la firma digital del texto sin formato.
implementación de java:
paquete com.cn cifrado unidireccional; import java.math.BigInteger; import java.security.MessageDigest;/*SHA (Secure Hash Algorithm, algoritmo hash seguro), firma digital y otras herramientas importantes en aplicaciones de criptografía. Se utiliza ampliamente en campos de seguridad de la información como el comercio electrónico. Aunque tanto SHA como MD han sido descifrados mediante métodos de colisión, SHA sigue siendo un algoritmo de cifrado seguro reconocido y es más seguro que MD*/public class SHA { public static final String KEY_SHA = "SHA public static String getResult( String inputStr)" { BigInteger sha =null; System.out.println("========Datos antes del cifrado:"+inputStr byte[] inputData); inputStr.getBytes(); intente { MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA); messageDigest.update(inputData); sha = new BigInteger(messageDigest.digest()); sha.toString()); } captura (Excepción e) {e.printStackTrace();} retorno sha.toString(); } public static void main(String args[]) { try { String inputStr = "Cifrado simple"; getResult(inputStr); catch (Exception e) { e.printStackTrace();
Comparación SHA con MD
Dado que ambos se derivan de MD, SHA- y MD son muy similares entre sí. En consecuencia, sus puntos fuertes y otras características son similares, pero existen varias diferencias:
Seguridad contra ataques de fuerza bruta: la diferencia más significativa e importante es que el resumen SHA es más largo que el resumen MD. Usando técnicas de fuerza bruta, la dificultad de generar cualquier mensaje cuyo resumen sea igual a un resumen de mensaje dado es una operación del orden de magnitud para MD y una operación del orden de magnitud para SHA-. De esta manera, SHA- tiene mayor fuerza contra ataques de fuerza bruta.
Seguridad contra el criptoanálisis: debido al diseño de MD, que es vulnerable a los ataques de criptoanálisis, SHA- parece menos vulnerable a dichos ataques.
Velocidad: SHA: se ejecuta más lento que MD en el mismo hardware.
El cuarto tipo.HMAC
HMAC (Código de autenticación de mensaje hash, código de autenticación de mensaje hash, protocolo de autenticación basado en el algoritmo hash de clave. El principio del código de autenticación de mensajes para lograr la autenticación es utilizar una función pública y una clave para generar un valor de longitud fija como identificador de autenticación. Usar Esto identifica la integridad del mensaje. Utilice una clave para generar un pequeño bloque de datos de tamaño fijo, es decir, MAC, y agréguelo al mensaje y luego transmítalo utilizando la clave compartida con el remitente para la autenticación.
código de implementación de Java:
paquete com.cn.Cifrado unidireccional;/*HMACHMAC(Autenticación de mensaje hash Código, código de autenticación de mensaje hash, protocolo de autenticación basado en algoritmo hash de clave El principio del código de autenticación de mensaje es utilizar una función y una clave públicas para generar un valor de longitud fija como identificador de autenticación, y utilizar este identificador para autenticar la integridad de. el mensaje Use una clave para generar un pequeño bloque de datos de tamaño fijo, es decir, MAC, y agréguelo al mensaje, y luego transmítalo. El receptor usa la clave compartida con el remitente para autenticación, etc. javax.crypto.KeyGenerator;importar javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import com.cn.comm.Tools;/** * Componente de cifrado básico*/ clase abstracta pública HMAC { cadena final estática pública KEY_MAC = "HmacMD"; /** * Inicializar clave HMAC* * @return * @throws Exception */ public static String initMacKey() lanza una excepción { KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC) SecretKey secretKey = keyGenerator.generateKey(); return BASE.encryptBASE(secretKey.getEncoded() } /** * Cifrado HMAC: método principal * * @param datos * @param clave * @return * @throws Excepción */ cadena estática pública encryptHMAC(byte[] datos, clave de cadena) lanza excepción {ClaveSecreta secretKey = new SecretKeySpec(BASE.decryptBASE(key), KEY_MAC Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey) return new String(mac.doFinal(data)); cadena estática getResult(String inputStr) { String ruta=Tools.getClassPath(); fileSource=path+"/file/HMAC_key.txt"; System.out.println("========Datos antes del cifrado:"+inputStr); String result=null; getBytes(); String key = HMAC.initMacKey(); /*Generar clave*/ System.out.println("Clave Mac:===" + clave /*Escribir clave en el archivo*/ Tools.WriteMyFile(fileSource,key); resultado= HMAC.encryptHMAC(inputData, key); System.out.println("Después del cifrado HMAC:===" + resultado} catch (Exception e) {e.printStackTrace( );} return resultado.toString(); } cadena estática pública getResult(String inputStr) { System.out.println("========Datos antes del cifrado:"+inputStr); String path=Tools.getClassPath(); String fileSource=path+"/file/HMAC_key.txt"; ;; intente { /*Leer la clave del archivo*/ key=Tools.ReadMyFile(fileSource) System.out.println("getResult key:===" + key); (Excepción e) { e.printStackTrace();} String result=null; try { byte[] inputData = inputStr.getBytes(); /*Cifrar datos*/ result= HMAC.encryptHMAC(inputData, key .out); .println("Después del cifrado HMAC:===" + resultado); } catch (Excepción e) {e.printStackTrace();} return result.toString(); main(String args[]) { try { String inputStr = "Cifrado simple" /*Utilice la misma clave: Cifre los datos: compruebe si los resultados de los dos cifrados son los mismos*/ getResult(inputStr); ); } captura (Excepción e) { e.printStackTrace();
El contenido anterior son varios algoritmos de cifrado (cuatro tipos) comúnmente utilizados en Java compartidos por el editor. Espero que les guste.