Red de conocimiento informático - Conocimiento sistemático - Discusión sobre la tecnología de cifrado Java (2)

Discusión sobre la tecnología de cifrado Java (2)

A continuación presentamos el algoritmo de cifrado simétrico. El más utilizado es el algoritmo de cifrado de datos DES.

DES

DES Data Encryption Standard es el algoritmo de cifrado de datos. desarrollado por IBM. Los parámetros de entrada del algoritmo DES que se investigaron y publicaron con éxito en 2008 tienen tres modos de datos clave. La clave es de n bytes y la clave de trabajo del algoritmo DES también es de n bytes. son los datos que se van a cifrar o descifrar. El modo es DES. Hay dos formas de trabajar: cifrado o descifrado

El algoritmo DES convierte un bloque de bits de entrada de texto sin formato en un bloque de bits de salida de texto cifrado. que utiliza también es un bit

La implementación es la siguiente a través del código java

import?java security Key;import?java security SecureRandom;?import ?javax crypto Cipher;importar?javax crypto KeyGenerator;importar?javax crypto SecretKey; importar?javax crypto SecretKeyFactory;importar?javax crypto spec DESKeySpec;/**?*//***?DES componente de codificación segura?autor?por? ;?**?

*?Soporte?DES DESede(TripleDES es DES) AES Blowfish RC RC (ARCFOUR)*?DES?key?size?must?be?equal?to?*?DESede(TripleDES)key? ¿el tamaño debe ser igual a o *? clave AES? ¿el tamaño debe ser igual a o pero los bits pueden no estar disponibles *? ser?múltiplo?de y?puede?sólo?variar?desde?a (inclusive)*?RC ?clave?tamaño?debe?estar y bits*?RC (ARCFOUR)?clave?tamaño?debe?estar?estado y bits*?Contenido específico?¿Necesita prestar atención?JDK?Documento&///docs/ technotes/guides/security/l*?
**?@autor?李东*?@versión *?@since? */?public?abstract?class?DESCoder?extends?Coder?{/** ?*//***?ALGORITHM?Algorithm?
*?Se puede reemplazar por cualquiera de los siguientes algoritmos y el tamaño del ¿El valor de la clave cambia en consecuencia**?
*?DES?key?size?must?be?qual?to?*?DESede(TripleDES)key?size?must?be?equal?to? El tamaño debe ser igual a o, pero los bits pueden no estar disponibles*. ¿El tamaño de la clave Blowfish debe ser múltiple de y solo puede variar de a ( inclusive)*?RC ?llave?tamaño?debe?estar y

bits*?RC (ARCFOUR)?key?size?must?be?beeen y bits*?

**?Utilice el siguiente código en el método Key?toKey(byte[]?key)*? SecretKey?secretKey?=?new?SecretKeySpec(key ?ALGORITHM);?Replace *?*?DESKeySpec?dks?=?new?DESKeySpec(key);*?SecretKeyFactory?keyFactory?=?SecretKeyFactory getInstance(ALGORITHM);*?SecretKey?secretKey?=?keyFactory generateSecret(dks);*?*/?public?static?final?String?ALGORITHM?=?DES ;?/**?*// ***?Convertir clave
**?@param?key*?@return*?@throws?Exception*/?private?static?Key?toKey(byte[]?key)?throws?Exception?{ DESKeySpec ?dks?=?new?DESKeySpec(key);SecretKeyFactory?keyFactory?=?SecretKeyFactory getInstance(ALGORITHM);SecretKey?secretKey?=?keyFactory generateSecret(dks);?//?Cuando se utilizan otros algoritmos de cifrado simétrico como AES Cuándo utilizando Blowfish y otros algoritmos, reemplace las tres líneas de código anteriores con el siguiente código //SecretKey?secretKey?=?new?SecretKeySpec(key ?ALGORITHM);?return?secretKey;}?/**?*//* **?descifrado **?@param?data*?@param?key*?@return*?@throws?Exception*/?public?static?byte[]?decrypt(byte[]?data ?String?key) ?lanza?Excepción ?{Clave?k?=?toKey(decryptBASE (clave));?Cipher?cipher?=?Cipher getInstance(ALGORITHM);cipher init(Cipher DECRYPT_MODE ?k);?return?cipher doFinal(datos) ;}?/ **?*//***?Encryption**?@param?data*?@param?key*?@return*?@throws?Exception*/?public?static?byte[]?encrypt (byte[] ?datos ?Cadena?clave)?lanza?Excepción?{Clave?k?=?toKey(decryptBASE (clave));Cifrado?cipher?=?Cifrado getInstance(ALGORITHM);cifrado init(Cifrado ENCRYPT_MODE ?k );?return ?cipher doFinal(data);}?/**?*//***?Generar clave**?@return*?@throws?Exception*/?public?static?String?initKey()? a través

ws?Exception?{return?initKey(null);}?/**?*//***?Generar clave**?@param?seed*?@return*?@throws?Exception*/?public static? ?String?initKey(String?seed)?throws?Exception?{SecureRandom?secureRandom?=?null;?if?(seed?!=?null)?{secureRandom?=?new?SecureRandom(decryptBASE (seed)) ; }?else?{secureRandom?=?new?SecureRandom();}?KeyGenerator?kg?=?KeyGenerator getInstance(ALGORITHM);kg init(secureRandom);?SecretKey?secretKey?=?kg generateKey();?return ? encryptBASE (secretKey getEncoded());}}

Continuando con la implementación de la clase anterior, usamos MD y SHA para cifrar cadenas para generar claves. Este es un método común de generación de claves

< p. > Dar otra clase de prueba

import?static? junit Assert *;?import junit Test;?/**?*//****?@author?by?;;? versión? *?@since? */?public?class?DESCoderTest?{?@Test?public?void?test()?throws?Exception?{String?inputStr?=? ();Error del sistema println(Texto original:\t ?+?inputStr);?Error del sistema println(Clave:\t ?+?key);?byte[]?inputData?=?inputStr getBytes(); ?DESCoder encrypt(inputData ?key);?System err println(después del cifrado:\t ?+?DESCoder encryptBASE (inputData));?byte[]?outputData?=?DESCoder decrypt(inputData ?key);String ?outputStr? =?new?String(outputData);?System err println(after decryption:\t ?+?outputStr);?assertEquals(inputStr ?outputStr);}}

El contenido de salida obtenido es el siguiente

Texto original DES

Clave f wEtRrV q =

Después del cifrado C qe oNIzRY=

Después del descifrado DES

Podemos comparar la salida obtenida de la consola y los resultados de cifrado y descifrado son consistentes. Este es un método de cifrado y descifrado simple con una sola clave

De hecho, DES tiene muchos hermanos como DESede (TripleDES). ) AES Blowfish RC RC (ARCFOUR) No daré muchos detalles aquí. Simplemente reemplace ALGORITHM con el valor correspondiente y reemplace el código SecretKey secretKey = new SecretKeySpec (clave ALG).

ORITMO) Además, la longitud de la clave es diferente

 /** lishixinzhi/Article/program/Java/gj/201311/27624