English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Problemas de segurança têm se tornado um problema cada vez mais importante, como criptografar e descriptografar dados importantes no Java é o tema principal deste artigo.
Um, criptografia comum/algoritmo de decodificação
1.Base;64
Em termos rigorosos, Base64não é uma criptografia/algoritmo de decodificação, mas é um método de codificação. Base64não gera a chave, através de Base64A mensagem criptografada pode ser diretamente "traduzida" para texto claro, mas pode ser criptografada adicionando caracteres de confusão ao texto claro.
2.DES
DES é baseado em56algoritmo de criptografia simétrica com chave de bits1976foi designado como padrão federal de processamento de informações pelo Bureau Nacional de Padrões dos Estados Unidos em 1977, e posteriormente se espalhou amplamente no mundo. Hoje, o DES já não é um algoritmo de criptografia seguro e foi quebrado publicamente. Agora, o DES já foi substituído pelo padrão de criptografia avançado (AES).
3.3DES
3DES é uma derivada do DES, que melhora a segurança prática do DES.
4.AES
AES é uma das mais populares algoritmos de criptografia simétrica atualmente.
二、实现所需的一些库
为了实现上述的算法,我们可以实用JDK自带的实现,也可以使用一些开源的第三方库,例如Bouncy Castle(https://www.bouncycastle.org/)和comnons codec(https://commons.apache.org/proper/commons-codec/)。
三、具体实现
1.Base;64
package com.tancky.security; import java.io.IOException; import sun.misc.BASE;64Decoder; import sun.misc.BASE;64Encoder; public class Base64Demo { private static String src = "TestBase64"; public static void main(String[] args) { Base64Demo.jdkBase64(); Base64Demo.commonsCodecBase64 (); Base64Demo.bouncyCastleBase64 (); } //使用JDK的base64实现, public static void jdkBase64 (){ BASE;64Encoder encoder = new BASE;64Encoder(); String encode = encoder.encode(Base;64Demo.src.getBytes()); System.out.println("encode: "); + encode); BASE;64Decoder decoder = new BASE;64Decoder(); try { String decode = new String(decoder.decodeBuffer(encode)); System.out.println("decode: "); + decode); } catch (IOException e) { e.printStackTrace(); } } //使用apache的commonsCodec实现 public static void commonsCodecBase64 (){ byte[] encodeBytes = org.apache.commons.codec.binary.Base64.encodeBase64(Base64Demo.src.getBytes()); String encode = new String (encodeBytes); System.out.println("encode: "); + encode); byte[] decodeBytes = org.apache.commons.codec.binary.Base64.decodeBase64(encode); String decode = new String(decodeBytes); System.out.println("decode: "); + decode); } //使用bouncyCastlede实现 public static void bouncyCastleBase64 () { byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(Base64Demo.src.getBytes()) ; String encode = new String (encodeBytes); System.out.println("encode: "); + encode); byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encode); String decode = new String(decodeBytes); System.out.println("decode: "); + decode); } }
2.DES
package com.tancky.security; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; import java.security.spec.InvalidKeySpecException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; public class DESDemo { private static String src = "TestDES"; public static void jdkDES () { try { //Geração de chave de criptografia KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); keyGenerator.init(56); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //Conversão de KEY DESKeySpec deSedeKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //Criptografia Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Preenchimento"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(DESDemo.src.getBytes()); System.out.println("DESEncode :" + Hex.toHexString(encodeResult)); //Descriptografia cipher.init(Cipher.DECRYPT_MODE,convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("DESDncode :" + new String (DecodeResult)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (BadPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } } public static void bcDES (){ try { //Uso do criptografia DES do BouncyCastle Security.addProvider(new BouncyCastleProvider()); //Geração de chave de criptografia KeyGenerator keyGenerator = KeyGenerator.getInstance("DES","BC"); keyGenerator.init(56); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //Conversão de KEY DESKeySpec deSedeKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //Criptografia Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Preenchimento"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(DESDemo.src.getBytes()); System.out.println("DESEncode :" + Hex.toHexString(encodeResult)); //Descriptografia cipher.init(Cipher.DECRYPT_MODE,convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("DESDncode :" + new String (DecodeResult)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (BadPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } } public static void main(String[] args) { DESDemo.jdkDES (); DESDemo.bcDES(); } }
3.3DES
package com.tancky.security; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; import java.security.spec.InvalidKeySpecException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; public class TripleDESDemo { private static String src = "TestTripleDES"; public static void jdkTripleDES () { try { //Geração de chave de criptografia KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede"); keyGenerator.init(168); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //Conversão de KEY DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //Criptografia Cipher cipher = Cipher.getInstance("DESede"}/ECB/PKCS5Preenchimento"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(TripleDESDemo.src.getBytes()); System.out.println("TripleDESEncode :" + Hex.toHexString(encodeResult)); //Descriptografia cipher.init(Cipher.DECRYPT_MODE,convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("TripleDESDncode :" + new String (DecodeResult)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (BadPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } } public static void bcTripleDES () { try { Security.addProvider(new BouncyCastleProvider()); //Geração de chave de criptografia KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede","BC"); keyGenerator.getProvider(); keyGenerator.init(168); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //Conversão de KEY DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //Criptografia Cipher cipher = Cipher.getInstance("DESede"}/ECB/PKCS5Preenchimento"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(TripleDESDemo.src.getBytes()); System.out.println("TripleDESEncode :" + Hex.toHexString(encodeResult)); //Descriptografia cipher.init(Cipher.DECRYPT_MODE,convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("TripleDESDncode :" + new String (DecodeResult)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (BadPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } } public static void main(String[] args) { jdkTripleDES (); bcTripleDES (); } }
4.AES
package com.tancky.security; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.SecureRandom; import java.security.Security; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; public class AESDemo { private static String src = "TestAES"; public static void jdkAES (){ try { //Geração de Chave KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); //keyGenerator.init(128, new SecureRandom("seedseedseed".getBytes())); //A utilização deste método de inicialização permite gerar uma chave específica com um semente específico, resultando em um ciphertext加密 após a criptografia que é fixo e único. SecretKey secretKey = keyGenerator.generateKey(); byte[] keyBytes = secretKey.getEncoded(); //Conversão de Chave Key key = new SecretKeySpec(keyBytes, "AES"); //Criptografia Cipher cipher = Cipher.getInstance("AES",/ECB/PKCS5Preenchimento"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encodeResult = cipher.doFinal(AESDemo.src.getBytes()); System.out.println("AESencode : ") + Hex.toHexString(encodeResult) ); //Descriptografia cipher.init(Cipher.DECRYPT_MODE, key); byte[] decodeResult = cipher.doFinal(encodeResult); System.out.println("AESdecode : "); + new String (decodeResult)); } catch (NoSuchAlgorithmException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (InvalidKeyException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (BadPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } } public static void bcAES (){ try { //Uso do criptografia DES do BouncyCastle Security.addProvider(new BouncyCastleProvider()); //Geração de Chave KeyGenerator keyGenerator = KeyGenerator.getInstance("AES","BC"); keyGenerator.getProvider(); keyGenerator.init(128); SecretKey secretKey = keyGenerator.generateKey(); byte[] keyBytes = secretKey.getEncoded(); //Conversão de Chave Key key = new SecretKeySpec(keyBytes, "AES"); //Criptografia Cipher cipher = Cipher.getInstance("AES",/ECB/PKCS5Preenchimento"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encodeResult = cipher.doFinal(AESDemo.src.getBytes()); System.out.println("AESencode : ") + Hex.toHexString(encodeResult) ); //Descriptografia cipher.init(Cipher.DECRYPT_MODE, key); byte[] decodeResult = cipher.doFinal(encodeResult); System.out.println("AESdecode : "); + new String (decodeResult)); } catch (NoSuchAlgorithmException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (InvalidKeyException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (BadPaddingException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO Bloco catch gerado automaticamente e.printStackTrace(); } } public static void main(String[] args) { jdkAES(); bcAES(); } }
Isso é tudo o que há no artigo. Espero que o conteúdo deste artigo ajude a aprendizagem ou ao trabalho de alguém, e também esperamos que você dê mais apoio ao tutorial Grito!
Declaração: O conteúdo deste artigo é proveniente da Internet, pertence ao respectivo proprietário. O conteúdo é contribuído e carregado voluntariamente pelos usuários da Internet. Este site não possui direitos de propriedade, não foi editado artificialmente e não assume responsabilidade por eventuais responsabilidades legais. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Em caso de verificação, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)