java 對稱加密算法實(shí)現(xiàn)詳解
前言
對于信息的加密方式多種多樣,之前為大家介紹了一種自己設(shè)計(jì)的加密方式,有興趣的朋友可以欣賞一下,歡迎給予指點(diǎn)。今天為大家介紹一下對稱加密方式,所謂對稱加密指的是加密和解密方式呈對稱格式,即解密是加密的逆過程,下面我們就看一下:DES、3DES、AES、PBE這四種方式,他們的加密強(qiáng)度依次遞增。好吧閑話少說,上代碼:
首先我們先看一下DES:
package cn.edu.hpu.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;
public class jdk_DES {
private static final String src = "I Love You !";
public static void main(String [] args){
jdk_DES.jdkDES();
}
@SuppressWarnings("static-access")
public static void jdkDES(){
try {
//獲得KEY
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
keyGenerator.init(56);//設(shè)置為默認(rèn)值56即可
//獲得KEY對象
SecretKey secrekeyone = keyGenerator.generateKey();
byte [] byteskey = secrekeyone.getEncoded();
//KEY轉(zhuǎn)換
DESKeySpec deskeyspec = new DESKeySpec(byteskey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
Key secerkeytwo = factory.generateSecret(deskeyspec);
//加密
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(cipher.ENCRYPT_MODE, secerkeytwo);//設(shè)置模式為加密
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("jdkEDS:"+result.toString());
//解密
cipher.init(cipher.DECRYPT_MODE, secerkeytwo);//設(shè)置模式為解密
result = cipher.doFinal(result);
System.out.println("jdkEDS:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:

第二種3重DES:
package cn.edu.hpu.des;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class jdk_3DES {
private static final String src = "I Love You !";
public static void main(String [] args){
jdk_3DES.jdk3DES();
}
@SuppressWarnings("static-access")
public static void jdk3DES(){
try {
//獲得KEY
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
//keyGenerator.init(112);//設(shè)置密鑰長度,默認(rèn)值為168,也可設(shè)置為112
keyGenerator.init(new SecureRandom());//設(shè)置為默認(rèn)值
//獲得KEY對象
SecretKey secrekeyone = keyGenerator.generateKey();
byte [] byteskey = secrekeyone.getEncoded();
//KEY轉(zhuǎn)換
DESKeySpec deskeyspec = new DESKeySpec(byteskey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
Key secerkeytwo = factory.generateSecret(deskeyspec);
//加密
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(cipher.ENCRYPT_MODE, secerkeytwo);//設(shè)置模式為加密
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("jdkEDS:"+result.toString());
//解密
cipher.init(cipher.DECRYPT_MODE, secerkeytwo);//設(shè)置模式為解密
result = cipher.doFinal(result);
System.out.println("jdkEDS:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:

第三種AES:
package cn.edu.hpu.aes;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class jdk_AES {
private static final String src = "I Love You !";
public static void main(String [] args){
AES();
}
public static void AES(){
try {
//獲得key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(new SecureRandom());//默認(rèn)密鑰長度為:
SecretKey secretKey = keyGenerator.generateKey();
byte [] keyBytes = secretKey.getEncoded();
//key轉(zhuǎn)換
Key key = new SecretKeySpec(keyBytes, "AES");
//加密
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("AES="+result.toString());
//解密
cipher.init(Cipher.DECRYPT_MODE, key);
result = cipher.doFinal(result);
System.out.println("AES="+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:

最后一種PBE:
package cn.edu.hpu.pbe;
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;
public class jdk_PBE {
public static final String src = "I Love You !";
public static void main(String [] args){
jdkPBE();
}
private static void jdkPBE(){
try {
//初始化鹽
SecureRandom random = new SecureRandom();
byte [] salt = random.generateSeed(8);
//口令和密鑰
String password = "imooc";
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());//生成密鑰轉(zhuǎn)換對象
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
Key key = factory.generateSecret(pbeKeySpec);
//加密
PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, 100);//實(shí)例化PBE對象的一個(gè)輸入的材料:參數(shù)分別為"鹽和迭代次數(shù)"
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
byte [] result = cipher.doFinal(src.getBytes());
System.out.println("PBE:"+result.toString());
//解密
cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
result = cipher.doFinal(result);
System.out.println("PBE:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:

結(jié)語
對于以上四種方式,PBE是一種較安全的加密方式,對加密起絕定作用的是鹽和password,決定著加密的結(jié)果。以上即使要為大家介紹的對稱加密方式,哪位有更好的方式,還望指教。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java連接MySQL數(shù)據(jù)庫命令行程序過程
SQL編程包括兩種形式,一種是過程化編程,主要通過數(shù)據(jù)庫交互式工具,通過存儲(chǔ)過程、觸發(fā)器、函數(shù)等形式的編程;另一種是嵌入式SQL編程,將SQL語句嵌入到高級(jí)開發(fā)語言,完成數(shù)據(jù)的各種操作2021-10-10
Java詳解HashMap實(shí)現(xiàn)原理和源碼分析
這篇文章主要介紹了Java關(guān)于HashMap的實(shí)現(xiàn)原理并進(jìn)行源碼分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
springboot+idea熱部署的實(shí)現(xiàn)方法(自動(dòng)刷新)
這篇文章主要介紹了springboot+idea熱部署的實(shí)現(xiàn)方法(自動(dòng)刷新),本文分步驟通過實(shí)例代碼截圖相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
關(guān)于java中構(gòu)造函數(shù)的一些知識(shí)詳解
下面小編就為大家?guī)硪黄P(guān)于java中構(gòu)造函數(shù)的一些知識(shí)詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
如何在SpringBoot項(xiàng)目中使用Oracle11g數(shù)據(jù)庫
這篇文章主要介紹了在SpringBoot項(xiàng)目中使用Oracle11g數(shù)據(jù)庫的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

