Algoritmo de criptografia DES
O DES é o padrão de criptografia de dados de nome completo, que é um algoritmo de bloco que usa a criptografia de chave. Foi determinado como o padrão federal de processamento de dados (FIPS) pelo Escritório Nacional de Padrões do Governo Federal dos EUA em 1976 e depois divulgou amplamente internacionalmente.
Existem três parâmetros de entrada do algoritmo DES: chave, dados e modo. Entre eles, Key é 7 bytes, 56 bits no total, que é a chave de trabalho do algoritmo DES; Os dados são de 8 bytes, 64 bits no total, que são os dados a serem criptografados ou descriptografados; Modo é o modo de funcionamento de DES: Criptografia ou descriptografia.
O algoritmo DES transforma o bloco de entrada de texto simples de 64 bits em um bloco de saída CipherText de 64 bits. A chave que ele usa também é de 56 bits. Seu algoritmo é dividido principalmente em duas etapas:
1) A função inicial de permutação é recombinar os blocos de dados de 64 bits de entrada em bits e dividir a saída em duas partes: L0 e R0, cada peça tem 32 bits de comprimento. A regra de permutação é alternar o 58º bit da entrada para o primeiro bit, o 50º bit para o segundo bit ... e assim por diante, o último bit é o 7º bit original. L0 e R0 são as duas partes após a saída da transposição, L0 é a esquerda 32 bits da saída e o R0 é o 32 bits direito. Exemplo: Defina o valor de entrada antes da transposição para D1D2D3 ... D64, o resultado após a permutação inicial é: L0 = D58D50 ... D8; R0 = d57d49 ... d7.
As regras de substituição são mostradas na tabela a seguir:
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,24,24,14,6,64,64,56,48,40,24,16,8 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,13,7,
2) Após 16 operações de iteração, L16 e R16 são obtidos. Pegue isso como entrada e execute permutação inversa. A permutação inversa é exatamente a operação inversa da permutação inicial, obtendo assim a saída de texto cifra.
Esse algoritmo é um representante do sistema de algoritmo de criptografia simétrico e é amplamente utilizado em sistemas de rede de computadores.
Implementação básica de Java
pacote com.stone.security; importar java.security.key; importar java.Security.SecureRandom; importar javax.crypto.cipher; importar javax.crypto.keygenerator; importar javax.crypto.secretkey; importar javax.crypto.secretKeyFactory; importar javax.crypto.spec.deskeyspec; importar javax.crypto.spec.ivparameterspec; / *** DES Algoritmo 1972 Desenvolvido pela IBM nos Estados Unidos, algoritmo de criptografia simétrica*/ public classe des {// algoritmo nome public static final string key_algorithm = "des"; // Nome do algoritmo/modo de criptografia/método de preenchimento público estático final String Cipher_algorithm_ecb = "DES/ECB/PKCS5Padding"; public static final string cipher_algorithm_cbc = "des/cbc/pkcs5padding"; public static void main (string [] args) lança Exceção { / * * Use Modo de Modo BCE * Generador de teclas para gerar o modo de tecla * ECB não pode usar IV * / byte [] key = generateKey (); byte [] Encrypt = Encrypt ("Gasculite F#*(x)". getBytes (), chave); System.out.println (new String (descripto (criptografia, key))); / * * Use o modo CBC * Use a fábrica de chaves para gerar a chave, criptografar e descriptografar * IV: DES no modo CBC e cifras RSA com operação de codificação OAEP. */ Deskeyspec dks = new Deskeyspec (generateKey ()); SecretKeyFactory Factory = secretKeyFactory.GetInstance (key_algorithm); SecretKey SecretKey = Factory.GenerateSecret (DKS); Cifra cifra = cipher.getInstance (cipher_algorithm_cbc); cipher.init (cipher.encrypt_mode, secretKey, novo IVParameterspec (getiv ())); byte [] ENC = cipher.dofinal ("Gasculite A%f#*(x)". getBytes ()); // criptografar cipher.init (cipher.decrypt_mode, secretKey, new IVParameterspec (getiv ())); byte [] DEC = cipher.dofinal (ENC); // decrypt system.out.println (new string (DEC)); } byte estático [] getiv () {string iv = "asdfivh7"; // comprimento iv: deve ter 8 bytes de retorno iv.getBytes (); } / ** * GERE TENAS * * @RETURN * @THOWSOWS Exceção * / Byte estático privado [] generateKey () lança exceção {keyGenerator keyGenerator = keyGenerator.getInstance (key_algorithm); keyGenerator.init (56); // DES deve ser 56, esse método inicial não precisa ligar para o secretKey SecretKey = keyGenerator.GeRekeKey (); retornar secretKey.getEncoded (); } / ** * Chave de restauração * * @param key * @return * @throws Exception * / private estático TOKEY (byte [] key) lança exceção {deskeyspec des = newSkeyspec (key); SecretKeyFactory keyFactory = secretKeyFactory.GetInstance (key_algorithm); SecretKey SecretKey = keyFactory.GenerateSecret (DES); retornar secretKey; } / *** Encrypt* @Param Data Original Text* @param key* @return cipherText* @throws exceção* / public static byte [] Encrypt (byte [] dados, byte [] key) lança exceção {key k = toke (key); Cifra cifra = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.encrypt_mode, k, new SecureRandom ()); return cipher.dofinal (dados); } / *** Decrypt* @Param Data Senha* @param key* @return Texto simples, texto original* @Throws Exception* / public static byte [] descriptografando (byte [] dados, byte [] key) lança exceção {key k = toke (key); Cifra cifra = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.decrypt_mode, k, new SecureRandom ()); return cipher.dofinal (dados); }} Implementação de Java Triple des:
pacote com.stone.security; importar javax.crypto.cipher; importar javax.crypto.keygenerator; importar javax.crypto.secretkey; importar javax.crypto.secretKeyFactory; importar javax.crypto.spec.desedekeyspec; importar javax.crypto.spec.ivparameterspec; / ** * A criptografia tripla 3DES também é usada como Triple des, */ public classe tripledes {// algoritmo name public static final string key_algorithm = "desede"; // Nome do algoritmo/modo de criptografia/método de preenchimento public static final string cipher_algorithm_ecb = "Desede/ECB/pkcs5padding"; public static final string cipher_algorithm_cbc = "Desede/cbc/pkcs5padding"; KeyGenerator privado keygen; SecretKey particular SecretKey; SecretKey particular SecretKey2; cifra privada cifra; byte estático privado [] EncryptData; public static void main (string [] args) lança exceção {tripledes tripledes = new tripledes ("beto"); tripledes.encrypt ("sau8jzxlcvm, '123`98 (*^&%^^ jcb zx >> a <s <}} {"); system.out.println ("após a criptografia:" + new string (tripledes.decrypt (cripyptData)); tripledes.encrypt2 ("sau8jzxlc dqv#> <« | vm, '123`98 (*^&%^^ jcb zx >> a <s <}} {"); system.out.println (" Após a Encryption: " + New String (EncryPtTtA); String (tripledes.decrypt2 (EncryptData))); KeyGenerator.getInstance (Key_algorithm); Desedekeyspec (keygen.GeraRey (). GetEncoded ()); secretKey); retornar EncryptData = cifra.Dofinal (str.getBytes ()); } / ** * Decrypt * @param Encrypt * @return * @throws Exception * / public byte [] Decrypt (byte [] Encrypt) lança exceção {cipher.init (cipher.decrypt_mode, secretKey); retornar EncryptData = cifra.Dofinal (Encrypt); } byte [] getiv () {return "Administ" .getBytes (); } / ** * Encrypt * @param str * @return * @throws Exception * / public byte [] Encrypt2 (String str) lança exceção {cipher.init (cipher.encrypt_mode, secretKey2, novo IVParameterSpec (getiv ())); retornar EncryptData = cifra.Dofinal (str.getBytes ()); } / ** * descriptografar * @param Encrypt * @return * @throws Exception * / public byte [] Decrypt2 (byte [] Encrypt) lança exceção {cipher.init (cipher.decrypt_mode, secretKey2, new IVParameterSpec (getiv ())); retornar EncryptData = cifra.Dofinal (Encrypt); }}