¿Cómo utilizar JAVA para implementar cifrado y descifrado de cadenas simples?
Las cadenas cifradas de Java pueden utilizar el algoritmo de cifrado des. El ejemplo es el siguiente:
paquete de prueba
import java.io.FileInputStream; >
importar java.io.FileOutputStream;
importar java.io.IOException;
importar java.io.ObjectInputStream;
importar java.io .ObjectOutputStream;
importar java.security.*;
importar javax.crypto.Cipher
importar javax.crypto.KeyGenerator; p>importar javax.crypto.SecretKey;
/**
* Cifrado y descifrado
*
* @author shy. qiu
* @since /qiushyfm
*/
clase pública CryptTest {
/**
* Realizar cifrado MD5
*
* @param info
* Información a cifrar
* @return String cadena cifrada p >
*/
public String encryptToMD5(String info) {
byte[] digesta = null
prueba {
<; p > // Obtener un resumen del mensaje md5MessageDigest alga = MessageDigest.getInstance("MD5");
// Agregar información para calcular el resumen
alga.update(info.getBytes());
// Obtener el resumen
digesta = alga.digest();
} catch (NoSuchAlgorithmException e ) {
e.printStackTrace();
}
// Convertir resumen en cadena
String rs = byte2hex (digesta) ;
return rs;
}
/**
* Realizar cifrado SHA
* p>
* @param info
* Información a cifrar
* @return Cadena cadena cifrada
*/
public String encryptToSHA(String info) {
byte[] digesta = null
prueba {
// Obtén un resumen del mensaje SHA de 1 p>
Desorden
ageDigest alga = MessageDigest.getInstance("SHA-1");
//Agrega información que se utilizará para calcular el resumen
alga.update(info.getBytes());
p>
// Obtener el resumen
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace( );
}
// Convertir resumen en cadena
String rs = byte2hex(digesta); p> devolver rs;
}
// //////////////////////////// ////// ////////////////////////////////////////////
/* *
* Crear clave
*
* @param algoritmo
* Algoritmo de cifrado, disponible DES, DESede, Blowfish p>
* @return SecretKey clave secreta (simétrica)
*/
public SecretKey createSecretKey (algoritmo de cadena) {
// Declarar objeto KeyGenerator
KeyGenerator keygen;
// Declarar objeto clave
SecretKey dekey = null;
try {
// Devuelve el objeto KeyGenerator que genera la clave secreta del algoritmo especificado
keygen = KeyGenerator.getInstance(algorithm);
// Genera una clave
dekey = keygen.generateKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
// Devuelve la clave
return dekey;
}
/**
* Realizar DES cifrado basado en la clave
p>*
* @param key
* Key
* @param info
* Información a cifrar
* @return Cadena de información cifrada
*/
public String encryptToDES(SecretKey key, String info) { p>
// Definir algoritmo de cifrado, disponible DES, DESede, Blowfish
String Algorithm = "DES";
// Generador de números aleatorios cifrados (RNG), (puede
(no escribir)
SecureRandom sr = new SecureRandom();
// Definir el texto cifrado a generar
byte[] cipherByte = null;
p>
intente {
// Obtenga el cifrado/descifrador
Cipher c1 = Cipher.getInstance(Algorithm
// Utilice la clave especificada y el modo de inicialización del objeto Cipher
// Parámetros: (ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE, UNWRAP_MODE)
c1.init(Cipher.ENCRYPT_MODE, key, sr );
// Codifica el contenido a cifrar,
cipherByte = c1.doFinal(info.getBytes()
} catch (Exception e); ) {
e.printStackTrace();
}
// Devuelve la forma hexadecimal del texto cifrado
return byte2hex(cipherByte ) ;
}
/**
* Descifrado DES basado en clave
*
* @ param key
* Clave
* @param sInfo
* El texto cifrado a descifrar
* @return Cadena después del descifrado Información
*/
public String decryptByDES(SecretKey key, String sInfo) {
// Definir algoritmo de cifrado,
String Algorithm = " DES";
// Generador de números aleatorios cifrados (RNG)
SecureRandom sr = new SecureRandom();
byte[] cipherByte = null ; p>
try {
// Obtener el cifrado/descifrador
Cipher c1 = Cipher.getInstance(Algorithm);
// Inicializar el cifrado objeto con la clave y el modo especificados
c1.init(Cipher.DECRYPT_MODE, key, sr);
// Codifica el contenido a descifrar
cipherByte = c1.doFinal(hex2byte(sInfo));
} catch (Excepción e) {
e.printStackTrace();
}
// return byte2hex(cipherByte);
return new String(cipherByte);
}
// /// ///// ////////////////////
/////////////////////////////////////////////////// //// //
/**
* Crea un grupo de claves y coloca la clave pública y la clave privada en el archivo especificado
* p>
* De forma predeterminada, se coloca en el archivo mykeys.bat
*/
public void createPairKey() {
try {
// Un generador de pares de claves basado en un algoritmo específico
KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
// Generador de números aleatorios cifrados ( RNG) p>
SecureRandom random = new SecureRandom();
// Restablecer la semilla de este objeto aleatorio
random.setSeed(1000);
// Inicializa un generador de pares de claves del tamaño de una clave utilizando la fuente aleatoria dada (y el conjunto de parámetros predeterminado)
keygen.initialize(512, random); // keygen.initialize(512);
// Generar grupo de claves
KeyPair llaves = keygen.generateKeyPair();
// Obtener la clave pública
PublicKey pubkey = llaves.getPublic();
// Obtener la clave privada
PrivateKey prikey = llaves.getPrivate();
// Obtener la clave pública para la clave privada Escribe en el archivo
doObjToFile("mykeys.bat", new Object[] { prikey, pubkey }
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* Utilice la clave privada para firmar la información Coloque la información firmada en el archivo especificado
*
* @param info
* Información a firmar
*. @param signfile
* Archivo almacenado
*/
public void signToInfo(String info, String signfile) {
// Leer la clave privada del archivo
PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);
// Lee la clave pública del archivo
p>PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.bat", 2);
try {
// El objeto de firma se puede utilizar para generar y verificar datos digitales firmas< /
p>
Firma signet = Signature.getInstance("DSA");
// Inicializa la clave privada para firmar la firma
signet.initSign(myprikey); p>
// Actualiza los datos a firmar o verificar por bytes
signet.update(info.getBytes());
// Firma o verifica todos los bytes actualizados Firmar , devolver firma
byte[] firmado = signet.sign();
// Coloca la firma digital, la clave pública y la información en el archivo
doObjToFile(signfile, new Object[] { firmado, mypubkey, info });
} catch (Excepción e) {
e.printStackTrace(); > }
}
/**
* Leer el archivo de firma digital para verificar la legalidad de la información en base a la clave pública, firma e información
*
* @return true si la verificación es exitosa false si la verificación falla
*/
public boolean validarSign(String signfile) {
// Leer la clave pública
PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);
// Leer la firma p>
byte[] firmado = (byte[]) getObjFromFile(signfile, 1);
// Leer información
String info = (String) getObjFromFile(signfile, 3);
try {
//Inicializar un objeto Firma y verificarlo con la clave pública y la firma
Signature signetcheck = Signature.getInstance("DSA ");
// Inicializa la clave pública para la verificación de firma
signetcheck.initVerify(mypubkey);
// Usa la matriz de bytes especificada para actualizar la datos a firmar o verificar
signetcheck.update(info.getBytes());
System.out.println(info);
// Verificar la firma entrante
return signetcheck .verify(signed);
} catch (Exception e) {
e.printStackTrace(); p> devuelve falso;
}
}
/**
* Convertir cadena binaria a hexadecimal
*
* @param b
* Matriz de bytes binarios
p>
* @return String
*/
public String byte2hex(byte[] b) {
String hs = "" ; p> p>
String stmp = "";
for (int n = 0; n lt; b.length; n ) {
stmp = (java.lang) .Integer .toHexString(b[n] amp; 0XFF));
if (stmp.length() == 1) {
hs = hs "0" stmp;
} else {
hs = hs stmp;
}
}
return hs.toUpperCase() ;
}
/**
* Convertir cadena hexadecimal a binaria
*
* @param hexadecimal
* @return
*/
byte público[] hex2byte(String hexadecimal) {
byte[ ] ret = nuevo byte[8];
byte[] tmp = hex.getBytes();
for (int i = 0; i lt; 8; i) {
ret[i] = unitBytes(tmp[i * 2], tmp[i * 2 1]);
}
return ret; }
/**
* Combina dos caracteres ASCII en un byte, como por ejemplo: "EF"--gt;
* @param src0
* byte
* @param src1
* byte
* @ retorno byte
*/
byte estático público uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" nueva cadena( nuevo byte[] { src0 }))
.byteValue();
_b0 = (byte) (_b0 lt; lt; 4);
byte _b1 = Byte.decode; ("0x" nueva cadena (nuevo byte[] { src1 }))
.byteValue();
byte ret = (byte) (_b0 ^ _b1
return ret;
}
/**
* Escribe el objeto especificado en el archivo especificado
*
* @param file
* Especifica el archivo a escribir
*
@param objs
* El objeto a escribir
*/
public void doObjToFile(String file, Object[] objs) {
ObjectOutputStream oos = null
prueba {
FileOutputStream fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos); >
for (int i = 0; i lt; objs.length; i ) {
oos.writeObject(objs[i]);
}
} catch (Excepción e) {
e.printStackTrace();
} finalmente {
prueba {
oos .close();
} captura (IOException e) {
e.printStackTrace()
}
} p> p>
}
/**
* Devuelve el objeto en la posición especificada en el archivo
*
* @param file
* El archivo especificado
* @param i
* A partir de 1
* @return p>
*/
objeto público getObjFromFile(archivo de cadena, int i) {
ObjectInputStream ois = null
objeto obj = null; /p>
intente {
FileInputStream fis = new FileInputStream(file);
ois = new ObjectInputStream(fis
for (int j); = 0; j lt; i; j) {
obj = ois.readObject();
}
} captura (Excepción e) { p>
e.printStackTrace();
} finalmente {
prueba {
ois.close(); } catch (IOException e) {
e.printStackTrace();
}
}
return obj;
}
/**
* Prueba
*
* @param args
* /
público estático vacío principal(St
ring[] args) {
CryptTest jiami = new CryptTest();
// Realiza el cifrado MD5 "¡Hola mundo!"
System.out.println ("Hola a través de MD5:" jiami.encryptToMD5("Hola"));
// Genera una clave de algoritmo DES
Clave SecretKey = jiami.createSecretKey("DES" );
// Usa la clave para cifrar el mensaje "¡Hola mundo!"
String str1 = jiami.encryptToDES(key, "Hello");
System .out.println("Usa des para cifrar información Hola: " str1);
// Usa esta clave para descifrar
String str2 = jiami.decryptByDES(key, str1);
System.out.println("Después del descifrado: " str2);
// Crear claves públicas y privadas
jiami.createPairKey(); p>
// Usa la clave privada para firmar ¡Hola mundo!
jiami.signToInfo("Hello", "mysign.bat"); verifica la firma.
if (jiami.validateSign("mysign.bat")) {
System.out.println("¡Éxito!");
} else {
System.out.println("¡Fallo!"
}
}
}
);