English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Häufig verwendete Verschlüsselung in Java/Detaillierte Erklärung der Entschlüsselungsmethode

安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容。

一、常用的加密/解密算法

1.Base;64

严格来说Base64并不是一种加密/解密算法,而是一种编码方式。Base64不生成密钥,通过Base64编码后的密文就可以直接“翻译”为明文,但是可以通过向明文中添加混淆字符来达到加密的效果。

2.DES

DES是一种基于56位密钥的对称算法,19761977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。现在DES已经不是一种安全的加密算法,已被公开破解,现在DES已经被高级加密标准(AES)所代替。

3.3DES

3DES是DES的一种派生算法,主要提升了DES的一些实用所需的安全性。

4.AES

AES是现在对称加密算法中最流行的算法之一。

二、实现所需的一些库

为了实现上述的算法,我们可以使用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 {
  //生成密钥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);
  //Verschlüsselung
  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));
  //}
  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 Automatisch generierter catch-Block
  e.printStackTrace();
 } catch (InvalidKeySpecException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
 }
 public static void bcDES () {
 try {
  //Verwendung von BouncyCastle für DES-Verschlüsselung
  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);
  //Verschlüsselung
  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));
  //}
  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 Automatisch generierter catch-Block
  e.printStackTrace();
 } catch (InvalidKeySpecException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  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);
  //Verschlüsselung
  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));
  //}
  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 Automatisch generierter catch-Block
  e.printStackTrace();
 } catch (InvalidKeySpecException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO Automatisch generierter catch-Block
  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);
  //Verschlüsselung
  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));
  //}
  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 Automatisch generierter catch-Block
  e.printStackTrace();
 } catch (InvalidKeySpecException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  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 {
  //Schlüssel generation
  KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
  keyGenerator.init(128); 
  //keyGenerator.init(128, new SecureRandom("seedseedseed".getBytes())); 
  //Mit diesem Initialisierungsmethoden kann ein Schlüssel mit einem spezifischen Seed generiert werden, so dass der nachfolgende geverschlüsselte Text fest und eindeutig ist.
  SecretKey secretKey = keyGenerator.generateKey();
  byte[] keyBytes = secretKey.getEncoded();
  //Schlüsselumwandlung
  Key key = new SecretKeySpec(keyBytes, "AES");
  //Verschlüsselung
  Cipher cipher = Cipher.getInstance("AES")/ECB/PKCS5Padding")
  cipher.init(Cipher.ENCRYPT_MODE, key);
  byte[] encodeResult = cipher.doFinal(AESDemo.src.getBytes());
  System.out.println("AESencode : ") + catch (NoSuchAlgorithmException e) {
  //}
  catch (NoSuchPaddingException e) {
  }
  catch (InvalidKeyException e) { + }
 catch (IllegalBlockSizeException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 catch (BadPaddingException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
 }
 public static void bcAES (){
 try {
  //Verwendung von BouncyCastle für DES-Verschlüsselung
  Security.addProvider(new BouncyCastleProvider());
  //Schlüssel generation
  KeyGenerator keyGenerator = KeyGenerator.getInstance("AES","BC");
  keyGenerator.getProvider();
  keyGenerator.init(128); 
  SecretKey secretKey = keyGenerator.generateKey();
  byte[] keyBytes = secretKey.getEncoded();
  //Schlüsselumwandlung
  Key key = new SecretKeySpec(keyBytes, "AES");
  //Verschlüsselung
  Cipher cipher = Cipher.getInstance("AES")/ECB/PKCS5Padding")
  cipher.init(Cipher.ENCRYPT_MODE, key);
  byte[] encodeResult = cipher.doFinal(AESDemo.src.getBytes());
  System.out.println("AESencode : ") + catch (NoSuchAlgorithmException e) {
  //}
  catch (NoSuchPaddingException e) {
  }
  catch (InvalidKeyException e) { + }
 catch (IllegalBlockSizeException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 catch (BadPaddingException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
  // TODO Automatisch generierter catch-Block
  e.printStackTrace();
 }
 }
 public static void main(String[] args) {
 jdkAES();
 bcAES();
 }
}

Das ist der Schluss des Artikels. Ich hoffe, dass dieser Artikel Ihnen bei Ihrem Lernen oder Ihrer Arbeit hilft und gleichzeitig eine Unterstützung für das Shouting-Tutorial.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie Inhalte finden, die möglicherweise Urheberrechtsverletzungen darstellen, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine Meldung senden, und geben Sie relevante Beweise an. Bei nachgewiesener Urheberrechtsverletzung wird diese Website die fraglichen Inhalte sofort löschen.)

Gefällt mir