Algoritmo de cifrado DES
DES es el estándar de cifrado de datos de nombre completo, que es un algoritmo de bloque que utiliza cifrado clave. Fue determinado como el estándar de procesamiento de datos federal (FIPS) por la Oficina Nacional de Normas del Gobierno Federal de los Estados Unidos en 1976, y luego fue ampliamente circulado a nivel internacional.
Hay tres parámetros de entrada del algoritmo DES: clave, datos y modo. Entre ellos, la clave es 7 bytes, 56 bits de total, que es la clave de trabajo del algoritmo DES; Los datos son 8 bytes, 64 bits en total, que son los datos que se encriptarán o descifrarán; El modo es el modo de trabajo de DES: cifrado o descifrado.
El algoritmo DES convierte el bloque de entrada de texto sin formato de 64 bits en un bloque de salida de texto cifrado de 64 bits. La clave que usa también es de 56 bits. Su algoritmo se divide principalmente en dos pasos:
1) La función de permutación inicial es recombinar los bloques de datos de 64 bits de entrada en bits y dividir la salida en dos partes: L0 y R0, cada parte tiene 32 bits de largo. La regla de permutación es cambiar el 58 ° bit de la entrada al primer bit, el 50 ° bit al segundo bit ... y así sucesivamente, el último bit es el séptimo bit original. L0 y R0 son las dos partes después de la salida de transposición, L0 son los 32 bits izquierdos de la salida y R0 es los 32 bits derecho. Ejemplo: establezca el valor de entrada antes de la transposición a D1D2D3 ... d64, luego el resultado después de la permutación inicial es: L0 = D58D50 ... D8; R0 = D57D49 ... D7.
Las reglas de reemplazo se muestran en la siguiente tabla:
58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8 Y 57,4917,41,33,25,17,17,97,17,59,51,51,51,27,27,27,27,111111.
2) Después de 16 operaciones de iteración, se obtienen L16 y R16. Tome esto como entrada y realice permutación inversa. La permutación inversa es exactamente la operación inversa de la permutación inicial, obteniendo así la salida de texto cifrado.
Este algoritmo es un representante del sistema de algoritmo de cifrado simétrico y se usa ampliamente en los sistemas de redes informáticas.
Implementación básica de Java
paquete com.stone.security; import java.security.key; import java.security.secureurandom; import javax.crypto.cipher; import javax.crypto.KeyGenerator; import javax.crypto.secretkey; import javax.crypto.secretkeyFactory; import javax.crypto.spec.deskeyspec; import javax.crypto.spec.ivparameterspec; / *** DES Algorithm 1972 Desarrollado por IBM en los Estados Unidos, algoritmo de cifrado simétrico*/ clase pública des {// nombre de algoritmo público static final string key_algorithm = "des"; // Nombre del algoritmo/Modo de cifrado/Método de relleno Public static final String Cipher_algorithm_ecb = "DES/ECB/PKCS5PADDING"; Cadena final Public Static final cipher_algorithm_cbc = "des/cbc/pkcs5padding"; public static void main (string [] args) lanza la excepción { / * * Usar el generador de teclas del modo ECB * para generar la tecla * El modo ECB no puede usar IV * / byte [] key = generateKey (); byte [] encrypt = encrypt ("gasculitis f#*(x)". getBytes (), clave); System.out.println (nueva cadena (Decrypt (CiCrypt, Key))); / * * Use el modo CBC * Use la fábrica de clave para generar la clave, cifrar y descifrar * IV: DES en modo CBC y cifrados RSA con operación de codificación OAEP. */ Deskeyspec dks = new DesKEYSPEC (GenerateKey ()); SecretKeyFactory Factory = SecretKeyFactory.getInstance (key_algorithm); SecretKey SecretKey = factory.GeneratesECret (dks); Cifrado cifrado = cipher.getInstance (cipher_algorithm_cbc); cipher.init (cipher.encrypt_mode, SecretKey, new IvParameterspec (getiv ()))); byte [] enc = cipher.dofinal ("gasculitis a%f#*(x)". getBytes ()); // cifrado cipher.init (cipher.decrypt_mode, secretkey, new ivParamETERSPEC (getiv ())); byte [] dec = cipher.dofinal (ENC); // Decrypt System.out.println (nueva cadena (dec)); } byte static [] getiv () {string iv = "asdfivh7"; // longitud iv: debe ser 8 bytes de largo retorno iv.getBytes (); } / ** * Generar clave * * @return * @throws Exception * / private static byte [] generateKey () lanza excepción {keyGenerator keyGenerator = keyGenerator.getInstance (key_algorithm); keyGenerator.init (56); // DES debe ser 56, este método inicial no tiene que llamar a SecretKey SecretKey = KeyGenerator.GenerateKey (); return secretkey.getEncoded (); } / ** * Restaurar clave * * @param Key * @return * @throws Exception * / private static key tokey (byte [] key) lanza la excepción {deskeyspec des = new DeskeySpec (clave); SecretKeyFactory KeyFactory = SecretKeyFactory.getInstance (key_algorithm); SecretKey SecretKey = KeyFactory.GeneratesECret (DES); regresar secretkey; } / *** cifrado* @param data texto original* @param key* @return cifradoxt* @throws excepción* / public static byte [] encrypt (byte [] data, byte [] key) lanza excepción {key k = toKey (key); Cifrado cifrado = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.encrypt_mode, k, new SecureRandom ()); return cipher.dofinal (datos); } / *** Decrypt* @param Contraseña de datos* @param Key* @return Texto plano, texto original* @throws excepción* / public static byte [] decrypt (byte [] data, byte [] key) lanza excepción {key k = tokey (key (key); Cifrado cifrado = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.decrypt_mode, k, new SecureRandom ()); return cipher.dofinal (datos); }} Java Triple des Implementación:
paquete com.stone.security; import javax.crypto.cipher; import javax.crypto.KeyGenerator; import javax.crypto.secretkey; import javax.crypto.secretkeyFactory; import javax.crypto.spec.desedeKeySpec; import javax.crypto.spec.ivparameterspec; / ** * El cifrado triple 3DES también se usa como triple des, */ clase pública tripledes {// nombre de algoritmo public static final string key_algorithm = "desede"; // Nombre del algoritmo/Modo de cifrado/Método de relleno Public static final String Cipher_algorithm_ecb = "desede/ecb/pkcs5padding"; Cadena final Public Static final cipher_algorithm_cbc = "desede/cbc/pkcs5padding"; KeyGenerator privado Keygen; privado secreto secretkey; privado secretkey secretkey2; cifrado privado cifra; byte estático privado [] encryptData; public static void main (string [] args) lanza la excepción {tripledes tripledes = new Tripledes ("ECB"); tripledes.Encrypt ("sau8jzxlcvm, '123`998 (*^&%^^ jcb zx >> a <s <}} {"); system.out.println ("después de la cifrado:" + nueva cadena (tripledes.decrypt (encryptdata))); tripleDes = new tripledes ("cbcccc"); tripleDes.Ensenrypt2 ("Sau8jzxLC dqv#> <« | vm, '123`99 (*^&%^^ JCB ZX >> a <s <}} {"); system.out.println (" después del cifrado: " + nueva cadena (encryptData)); system.out.println (" después de decrypt: " String (tripledes.decrypt2 (cifrado)); KeyGenerator.getInstance (key_algorithm); Desedekeyspec (keyGen.GenerateKey (). GetEncoded ()); SecretKey); return encryptData = cipher.dofinal (str.getbytes ()); } / ** * Decrypt * @param encrypt * @return * @throws excepción * / public byte [] Decrypt (byte [] encrypt) lanza la excepción {cipher.init (cipher.decrypt_mode, secretkey); return encryptData = cipher.dofinal (encrypt); } byte [] getiv () {return "administrar" .getBytes (); } / ** * encrypt * @param str * @return * @throws excepción * / public byte [] encrypt2 (string str) lanza la excepción {cipher.init (cipher.encrypt_mode, secretkey2, new iVParamETERSPEC (getiv ()); return encryptData = cipher.dofinal (str.getbytes ()); } / ** * Decrypt * @param encrypt * @return * @throws excepción * / public byte [] Decrypt2 (byte [] encrypt) lanza la excepción {cipher.init (cipher.decrypt_mode, secretkey2, new IvParAMETERSPEC (getiv ())); return encryptData = cipher.dofinal (encrypt); }}