La Red de Conocimientos Pedagógicos - Currículum vitae - ¿Puede el algoritmo MD5withRSA de Java ver el contenido descifrado?

¿Puede el algoritmo MD5withRSA de Java ver el contenido descifrado?

Hola,

<1>Algoritmo de cifrado MD5:

El algoritmo de resumen de mensajes versión 5 (algoritmo de resumen de mensajes) es un algoritmo de cifrado unidireccional. cifra pero no puede descifrar. Sin embargo, el algoritmo de cifrado MD5 ha sido descifrado con éxito por el profesor Wang Xiaoyun de la Universidad de Shandong en China. Sin embargo, en escenarios donde los requisitos de seguridad no son altos, el algoritmo de cifrado MD5 todavía tiene valor de aplicación. 1. Crear objeto md5:?

MessageDigest md5 = MessageDigest.getInstance("md5"); 2. Realizar operación de cifrado:?

byte[] cipherData = md5.digest(plainText.getBytes()); 3. Convierta cada byte en una cadena hexadecimal: el bit más alto de datos de tipo byte es el bit de signo, pasado Realice una operación AND con 0xff y convierta. a un entero positivo de tipo int. ?

String toHexStr = Integer.toHexString(cipher & 0xff); 4. Si el número positivo es menor que 16 (la longitud es 1 carácter), empalme 0 marcador de posición al frente: asegúrese de que el carácter final generado sea Cadena de caracteres de 32 bits.

?

builder.append(toHexStr.length() == 1 ? "0" + toHexStr : toHexStr); 5.? La cadena después de la conversión de cifrado es: c0bb4f54f1d8b14caf6fe1069e5f93ad 6. ¿Completar la aplicación del algoritmo MD5 como se muestra? a continuación:?

/**

* Descripción funcional: Pruebe el cifrado unidireccional MD5.

* @throws Exception

* /

@Test

public void test01() lanza una excepción {

String PlainText = "¡Hola, mundo!";

MessageDigest md5 = MessageDigest.getInstance("md5");

byte[] cipherData = md5.digest(plainText.getBytes());

Constructor StringBuilder = new StringBuilder();

for(cifrado de bytes: cipherData) {

String toHexStr = Integer.toHexString(cipher & 0xff);

builder.append(toHexStr.length() = = 1 ? "0" + toHexStr : toHexStr);

}

System.out.println(builder.toString());

/ /c0bb4f54f1d8b14caf6fe1069e5f93ad

}

<二> Utilice BASE64 para cifrar/descifrar:

El algoritmo BASE64 se utiliza generalmente para cifrar datos binarios y los datos cifrados no son fáciles. reconocido a simple vista. Estrictamente hablando, los datos cifrados por BASE64 en realidad no son seguros en absoluto, porque sus algoritmos de cifrado y descifrado son todos públicos. Por lo general, están diseñados para proteger contra principiantes, pero no contra programadores. Los datos cifrados por el algoritmo estándar BASE64 generalmente contienen símbolos especiales como /, +, =, etc., que no son adecuados para pasar como parámetros de URL. Afortunadamente, el módulo Commons Codec de Apache proporciona una encapsulación adicional de BASE64.

? (Consulte las instrucciones en la última parte) 1. Utilice el cifrado BASE64: ?

codificador BASE64Encoder = new BASE64Encoder();

String cipherText = encoder.encode(plainText.getBytes(? ) 2. Utilice el descifrado BASE64: ?

BASE64Decoder decoder = new BASE64Decoder();

plainText = new String(decoder.decodeBuffer(cipherText)); :?

/**

* Descripción funcional: utilice BASE64 para cifrado/descifrado bidireccional.

* @throws Exception

*/

@Test

public void test02() lanza una excepción {

codificador BASE64Encoder = new BASE64Encoder();

BASE64Decoder decodificador = new BASE64Decoder();

String PlainText = "¡Hola, mundo!";

String cipherText = encoder.encode(plainText.getBytes());

System.out.println("cipherText: " + cipherText);

//cipherText: SGVsbG8gLCB3b3JsZCAh

System.out.println("plainText: " +

new String(decoder.decodeBuffer(cipherText)));

//plainText: ¡Hola mundo!

}

<三>. DES Cifrado/descifrado simétrico:

? Algoritmo estándar de cifrado de datos (Estándar de cifrado de datos), la diferencia más obvia con BASE64 es que tiene una clave funcional, que se utiliza tanto para el cifrado como para el descifrado, y La clave Se requiere que sea una cadena con una longitud de al menos 8 caracteres. El núcleo del uso del cifrado y descifrado DES es garantizar la seguridad de la clave de trabajo.

1.?Generar una clave basada en la clave:?

DESKeySpec keySpec = new DESKeySpec(key.getBytes());

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("des");

SecretKey secretKey = keyFactory.generateSecret(keySpec 2.? Operación de cifrado:?

Cifrado = Cipher.getInstance("des");

cipher .init(Cipher.ENCRYPT_MODE, secretKey, new SecureRandom());

byte[] cipherData = cipher.doFinal(plainText.getBytes()); 3. Para observar fácilmente los datos cifrados generados. , use cifrado BASE64 nuevamente:?

String cipherText = new BASE64Encoder().encode(cipherData);

Genere texto cifrado de la siguiente manera: PtRYi3sp7TOR69UrKEIicA==? 4. Operación de descifrado:?

cipher.init(Cipher.DECRYPT_MODE, secretKey, new SecureRandom());

byte[] PlainData = cipher.doFinal(cipherData);

Cadena texto plano = new String(plainData); 5. Demostración completa del código:?

/**

* Descripción de la función: utilizar cifrado/descifrado simétrico DES.

* @throws Exception

*/

@Test

public void test03() throws Exception {

String PlainText = "Hola, mundo !";

String key = "12345678"; //Se requiere que la clave tenga al menos 8 caracteres de longitud

SecureRandom random = new SecureRandom();

DESKeySpec keySpec = new DESKeySpec(key.getBytes());

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("des");

SecretKey secretKey = keyFactory.generateSecret(keySpec

Cifrado cifrado = Cipher.getInstance("des");

cipher.init(Cipher.ENCRYPT_MODE, secretKey, aleatorio);

byte[ ] cipherData = cipher.doFinal(plainText.getBytes());

System.out.println("cipherText : " + new BASE64Encoder().encode(cipherData));

//PtRYi3sp7TOR69UrKEIicA==

cipher.init(Cipher.DECRYPT_MODE, secretKey , aleatorio);

byte[] PlainData = cipher.doFinal(cipherData);

System.out.println("plainText : " + new String(plainData)); p>

//¡Hola mundo!

}

<4> Utilice cifrado/descifrado asimétrico RSA:

El algoritmo RSA es. cifrado asimétrico Un representante típico del algoritmo, que puede cifrar y descifrar. La diferencia obvia con los algoritmos de cifrado simétrico como DES es que las claves utilizadas para el cifrado y el descifrado son diferentes. Usando el algoritmo RSA, siempre que la clave sea lo suficientemente larga (generalmente 1024 bits), la información cifrada no se puede descifrar.

Usuarios pass/Upload/Images/2014081321/99A5FC9C0C628374.gif" alt="Awkward" title="Awkward" border="0">

/**

* Breve descripción de funciones: utilice cifrado/descifrado asimétrico RSA.

* @throws Exception

*/

@Test

public void test04() lanza una excepción {

String PlainText = "¡Hola mundo!";

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("rsa");

keyPairGenerator.initialize( 1024);

KeyPair keyPair = keyPairGenerator.generateKeyPair();

PublicKey publicKey = keyPair.getPublic();

PrivateKey privateKey = keyPair.getPrivate() ;

Cifrado cifrado = Cipher.getInstance("rsa");

SecureRandom aleatorio = new SecureRandom();

cipher.init(Cipher.ENCRYPT_MODE, clave privada, aleatoria);

byte[] cipherData = cipher.doFinal(plainText.getBytes());

System.out.println("cipherText : " + new BASE64Encoder() .encode(cipherData));

//gDsJxZM98U2GzHUtUTyZ/Ir/NXqRWKUJkl6olrLYCZHY3RnlF3olkWPZ35Dwz9BMRqaTL3oPuyVq

//sehvHExxj9RyrWpIYnYLBSURB1KVUSLMsd/ONFOD0fn +T/+3yybVL8M+RI+HzbE/jdYa/+

//yQ+vHwHqXhuzZ/N8iNg=

cipher.init(Cipher.DECRYPT_MODE, publicKey, aleatorio);

byte[] PlainData = cipher.doFinal(cipherData)

System.out.println("plainText : " + new String(plainData));

//¡Hola mundo!

Firma firma = Firma . getInstancia("MD5withRSA");

firma.initSign(privateKey);

firma.update(cipherData);

byte[] signData = firma.sign();

System.out. println("firma: " + new BASE64Encoder().encode(signData));

//ADfoeKQn6eEHgLF8ETMXan3TfFO03R5u+cQEWtAQ2lRblLZw1DpzTlJJt1RXjU451I84v3297LhR

//co64p6Sq3kVt84wn RsQ w5mucZnY+jRZNdXpcbwh2qsh8287NM2hxWqp4OOCf/+vKKXZ3pbJMNT/4

///t9ewo+KYCWKOgvu5QQ=

firma.initVerify(publicKey);

firma.update(cipherData);

estado booleano = firma .verify(signData);

System.out.println("estado: " + estado);

//true

}