JAVA實現對稱加密


個人博客網:https://wushaopei.github.io/    (你想要這里多有)

一、對稱加密算法DES

1、概述:采用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密

對稱加密的特點:  即加密密鑰 = 解密密鑰

2、常用的對稱加密算法:

  •  初等
  •  DES   —3DES
  •  AES
  •  PBE
  •  IDEA

3、對稱加密算法 —— DES

DES( Data Encryption Standard ) 是一種數據加密標准

其密鑰規則如下:

4、JDK實現DES算法

【1】初始化密鑰

  • 使用KeyGenerator類的getInstance()靜態方法,獲取生成指定算法的密鑰生成器,參數是算法名稱.
  • 使用KeyGenerator類的init()方法進行密鑰生成器的初始化,指定密鑰生成器產生密鑰的長度.
  • 使用KeyGenerator類的generatorKey()方法生成一個密鑰對象,返回SecretKey密鑰對象.
  • SecretKey為密鑰對象.使用它的getEncoded()方法返回一個密鑰(字節數組形式)

【2】轉化密鑰(還原密鑰)

  • 將jdk生成的密鑰對象轉化成DES規則的密鑰對象.
  • 創建一個DESKeySpec實例,作用是將JDK初始化的密鑰轉化成DES規則的密鑰.
  • 構造方法參數是JDK生成的密鑰(字節數組形式).
  • 使用SecretKeyFactory類的getInstance()靜態方法獲取一個密鑰工廠實例,參數是算法名稱
  • 使用SecretKeyFactory類的generateSecret()方法生成密鑰,參數是DESKeySpec實例.返回SecretKey,返回的SecretKey實例就是符合DES算法的密鑰.
package com.webcode.cn.des; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import org.apache.commons.codec.binary.Hex; public class DES { static String string = "wen-min"; public static void main(String[] args) { DES.jdkDES(); } public static void jdkDES() { try { // 生成key//返回生成指定算法密鑰的KeyGenerator對象 KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); keyGenerator.init(56);//初始化此密鑰生成器,使其具有確定的密鑰大小 SecretKey secretKey = keyGenerator.generateKey();//生成一個密鑰 byte[] bs = secretKey.getEncoded(); // key轉換 DESKeySpec desKeySpec = new DESKeySpec(bs); //實例化DES密鑰規則 SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); //實例化密鑰工廠 Key convertSecretKey = factory.generateSecret(desKeySpec); //生成密鑰 // 加密 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] result = cipher.doFinal(string.getBytes()); System.out.println("jdk des encrypt:" + Hex.encodeHexString(result)); // 解密 cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); result = cipher.doFinal(result); System.out.println("jdk des decrypt:" + new String(result)); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } 

執行結果:

jdk des encrypt:ea3293902913510b
jdk des decrypt:wen-min

5、DES加密算法的消息傳遞機制;

加密算法深入學習鏈接:https://www.iteye.com/blog/snowolf-379860

二、對稱加密算法3DES

3DES,即3重DES,是DES的一個分支;但由於安全性問題;且違反柯克霍夫原則,使用頻率低。

好處:

  • 密鑰長度增強;
  • 迭代次數提高。

1、3重DES的規則:

2、JDK實現3DES

與實現DES方式基本一致,算法名稱要改為DESede,密鑰長度為168,轉換密鑰時使用DESedeKeySpec類.

在使用KeyGenerator的init()方法時,參數要指定密鑰的長度.可以直接指定一個數值.同時也可以使用SecureRandom實例作為參數,該實例的作用是獲取KeyGenerator對應算法其默認的密鑰長度.

package com.webcode.cn.des; import java.security.Key; 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.DESedeKeySpec; import org.apache.commons.codec.binary.Hex; public class DES_three { static String string = "wen-min"; public static void main(String[] args) { DES_three.jdkDES(); } public static void jdkDES() { try { // 生成key//返回生成指定算法密鑰的KeyGenerator對象 KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede"); keyGenerator.init(168);//初始化此密鑰生成器,使其具有確定的密鑰大小 SecretKey secretKey = keyGenerator.generateKey();//生成一個密鑰 byte[] bs = secretKey.getEncoded(); // key轉換 DESedeKeySpec desKeySpec = new DESedeKeySpec(bs); //實例化DES密鑰規則 SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); //實例化密鑰工廠 SecretKey convertSecretKey = factory.generateSecret(desKeySpec); //生成密鑰 // 加密 Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] result = cipher.doFinal(string.getBytes()); System.out.println("jdk 3des encrypt:" + Hex.encodeHexString(result)); // 解密 cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); result = cipher.doFinal(result); System.out.println("jdk 3des decrypt:" + new String(result)); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }

執行結果:

jdk 3des encrypt:0656fdb061c86e8a
jdk 3des decrypt:wen-min

三、對稱加密算法AES

1、概述

AES是DES的高級替代,也是目前使用最多的對稱加密算法

DES有漏洞,所以,產生了3重DES<br>
3重DES的效率比較低,所以產生了AES<br>

AES的特點是:

  • 使用的更為廣泛
  • 目前還沒有被破解
  • 通常用與移動通信系統加密和SSH協議的軟件加密

2、AES的使用規則:

3、JDK實現AES加密解密算法:

package com.webcode.cn.des; import java.security.Key; //import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; //import org.bouncycastle.util.encoders.Base64; public class AES { static String string = "wen-min"; public static void main(String[] args) { AES.jdkAES(); } public static void jdkAES(){ try { //生成key KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); //設置密鑰長度 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[] result = cipher.doFinal(string.getBytes()); System.out.println("jdk aes encrypt: " + Base64.encodeBase64String(result)); //初始化,設置為解密 cipher.init(Cipher.DECRYPT_MODE, key); result = cipher.doFinal(result); System.out.println("jdk aes desrypt:" + new String(result)); } catch (Exception e) { e.printStackTrace(); } } } 

4、AES對稱加密算法消息傳遞規則:

四、PBE加密算法

1、概述

PBE算法結合了消息摘要算法和對稱加密算法的優點。PBE是基於口令的加密

對稱加密算法之PBE的特點概述,本質上是對DES/3DES/AES對稱加密算法的包裝,不是新的算法,不過也是最為牛逼的一種方式。
:指加密的隨機字符串或者口令等,也可以人為是一些擾碼,防止密碼的暴力破解

 

2、PBE算法的規則:

加密算法安全等級:PBE>AES>3DES>DES

3、JDK實現PBE加密解密算法

package com.webcode.cn.des; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import org.apache.commons.codec.binary.Base64; public class PBE { static String string = "wen-min"; public static void main(String[] args) { PBE.jdkPBE(); } public static void jdkPBE() { try { //初始化鹽 SecureRandom random = new SecureRandom(); byte[] salt = random.generateSeed(8); // 加 密 口令與密鑰 String password = "imooc"; PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray()); SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES"); Key key = factory.generateSecret(pbeKeySpec); //加密 PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt,100); Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES"); cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec); byte[] result = cipher.doFinal(string.getBytes()); System.out.println("jdk PBE encrypt: " + Base64.encodeBase64String(result)); //解密 //初始化 cipher.init(Cipher.DECRYPT_MODE, key,pbeParameterSpec); result = cipher.doFinal(result); System.out.println("jdk PBE decrypt: " + new String(result)); } catch (Exception e) { e.printStackTrace(); } } } 

執行結果:

jdk PBE encrypt: GAIay1DowQQ=
jdk PBE decrypt: wen-min

4、PBE加密算法的消息傳遞機制



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM