English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Вопрос безопасности становится все более важным, и как шифровать и дешифровать важные данные в Java является главной темой этой статьи.
1. Часто используемые алгоритмы шифрования/дешифрования
1.Base64
Точнее говоря, Base64 не является алгоритмом шифрования/дешифрования, а является способом кодирования. Base64 не создает ключей, и зашифрованный текст, закодированный с помощью Base64,可以直接 «переводиться» в открытое текстовое сообщение, но можно добавить混淆ующие символы, чтобы достичь эффекта шифрования.
2.DES
DES является симметричным алгоритмом, основанным на 56-битном ключе, который в 1976 году был признан Федеральным бюро стандартов США (FIPS) стандартом обработки федеральных данных. После этого он стал широко распространяться в мире. В настоящее время DES больше не является безопасным алгоритмом шифрования и был открыт для破解. В настоящее время DES заменен более продвинутым стандартом шифрования (AES).
3.3DES
3DES является производным алгоритмом от DES, который в основном提升了DES в некоторых аспектах безопасности.
4.AES
AES является одним из самых популярных алгоритмов симметричного шифрования среди существующих.
2. Необходимые библиотеки для реализации
Для реализации вышеупомянутых алгоритмов мы можем использовать встроенную реализацию JDK, а также некоторые открытые第三方 библиотеки, такие как Bouncy Castle (https://www.bouncycastle.org/) и comnons codec (https://commons.apache.org/proper/commons-codec/)。
3. Конкретная реализация
1.Base64
package com.tancky.security; import java.io.IOException; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class Base64Demo { private static String src = "TestBase64"; public static void main(String[] args) { Base64Demo.jdkBase64(); Base64Demo.commonsCodecBase64 (); Base64Demo.bouncyCastleBase64 (); } // Использование реализаций base64 от JDK public static void jdkBase64 (){ BASE64Encoder encoder = new BASE64Encoder(); String encode = encoder.encode(Base64Demo.src.getBytes()); System.out.println("encode: " + encode); BASE64Decoder decoder = new BASE64Decoder(); try { String decode = new String ( decoder.decodeBuffer(encode)); System.out.println("decode: " + decode); } e.printStackTrace(); } } // Использование commonsCodec от Apache для обработки 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); } //использование bouncyCastle для реализации 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 { //生成密钥Key KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); keyGenerator.init(56); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //KEY转换 DESKeySpec deSedeKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //加密 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(DESDemo.src.getBytes()); System.out.println("DESEncode :" + Hex.toHexString(encodeResult)); catch (NoSuchPaddingException e) { cipher.init(Cipher.DECRYPT_MODE,convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("DESDncode :" + new String (DecodeResult)); catch (IllegalBlockSizeException e) { e.printStackTrace(); catch (BadPaddingException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); catch (NoSuchProviderException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } } public static void bcDES (){ try { //使用BouncyCastle 的DES加密 Security.addProvider(new BouncyCastleProvider()); //生成密钥Key KeyGenerator keyGenerator = KeyGenerator.getInstance("DES","BC"); keyGenerator.init(56); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //KEY转换 DESKeySpec deSedeKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //加密 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(DESDemo.src.getBytes()); System.out.println("DESEncode :" + Hex.toHexString(encodeResult)); catch (NoSuchPaddingException e) { cipher.init(Cipher.DECRYPT_MODE,convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("DESDncode :" + new String (DecodeResult)); catch (IllegalBlockSizeException e) { e.printStackTrace(); catch (BadPaddingException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); catch (NoSuchProviderException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch 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 { //生成密钥Key KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede"); keyGenerator.init(168); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //KEY转换 DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //加密 Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(TripleDESDemo.src.getBytes()); System.out.println("TripleDESEncode :" + Hex.toHexString(encodeResult)); catch (NoSuchPaddingException e) { cipher.init(Cipher.DECRYPT_MODE,convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("TripleDESDncode :" + new String (DecodeResult)); catch (IllegalBlockSizeException e) { e.printStackTrace(); catch (BadPaddingException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); catch (NoSuchProviderException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } } public static void bcTripleDES () { try { Security.addProvider(new BouncyCastleProvider()); //生成密钥Key KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede","BC"); keyGenerator.getProvider(); keyGenerator.init(168); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //KEY转换 DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //加密 Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(TripleDESDemo.src.getBytes()); System.out.println("TripleDESEncode :" + Hex.toHexString(encodeResult)); catch (NoSuchPaddingException e) { cipher.init(Cipher.DECRYPT_MODE,convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("TripleDESDncode :" + new String (DecodeResult)); catch (IllegalBlockSizeException e) { e.printStackTrace(); catch (BadPaddingException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); catch (NoSuchProviderException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch 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 { //生成Key KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); //keyGenerator.init(128, new SecureRandom("seedseedseed".getBytes())); //使用上面这种初始化方法可以特定种子来生成密钥,这样加密后的密文是唯一固定的。 SecretKey secretKey = keyGenerator.generateKey(); byte[] keyBytes = secretKey.getEncoded(); //Key转换 Key key = new SecretKeySpec(keyBytes, "AES"); //加密 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encodeResult = cipher.doFinal(AESDemo.src.getBytes()); System.out.println("AESencode : " + Hex.toHexString(encodeResult) ); catch (NoSuchPaddingException e) { } catch (InvalidKeyException e) { } catch (IllegalBlockSizeException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); catch (BadPaddingException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); catch (NoSuchProviderException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } } public static void bcAES (){ try { //使用BouncyCastle 的DES加密 Security.addProvider(new BouncyCastleProvider()); //生成Key KeyGenerator keyGenerator = KeyGenerator.getInstance("AES","BC"); keyGenerator.getProvider(); keyGenerator.init(128); SecretKey secretKey = keyGenerator.generateKey(); byte[] keyBytes = secretKey.getEncoded(); //Key转换 Key key = new SecretKeySpec(keyBytes, "AES"); //加密 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encodeResult = cipher.doFinal(AESDemo.src.getBytes()); System.out.println("AESencode : " + Hex.toHexString(encodeResult) ); catch (NoSuchPaddingException e) { } catch (InvalidKeyException e) { } catch (IllegalBlockSizeException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); catch (BadPaddingException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); catch (NoSuchProviderException e) { // TODO автоматически сгенерированный блок catch e.printStackTrace(); } // TODO автоматически сгенерированный блок catch e.printStackTrace(); } } public static void main(String[] args) { jdkAES(); bcAES(); } }
Вот и все, что касается этой статьи, я надеюсь, что содержимое статьи принесет вам определенную пользу в учебе или работе, и я也希望 вы поддержите учебник "Крик"!
Заявление: содержимое статьи предоставлено из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, загружен самостоятельно, сайт не имеет права собственности, не был обработан вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите подозрительное содержимое, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @), чтобы сообщить о нарушении, и предоставьте соответствующие доказательства. Если информация подтвердится, сайт незамедлительно удалил涉嫌侵权的内容。