使用3DES或DES對稱加密示例
阿新 • • 發佈:2021-01-27
該文章包含3DES和DES加密解密示例
注意3DES金鑰長度必須是8的倍數,而DES金鑰長度必須是8位元組
下面是使用3DES加密解密的過程示例
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
/**
* @author token AES演算法
* @date 2021年1月26日
*/
public class Encryp3DES {
// 金鑰(3DES加密和解密過程中,金鑰長度都必須是8的倍數)
private final static String secretKey = "zdy12345";
// 加解密統一使用的編碼方式
private final static String encoding = "utf-8";
public static void main(String[] args) throws Exception {
String input="巔峰小蘇" ;
String en=encode(input);
System.out.println("加密:"+en);
String de=decode(en);
System.out.println("解密:"+de);
}
/**
* 3DES加密
* @param plainText 普通文字
* @return
* @throws Exception
*/
public static String encode(String plainText) throws Exception {
// 從原始金鑰資料建立DESKeySpec物件
DESKeySpec dks = new DESKeySpec(secretKey.getBytes());
// 建立一個密匙工廠,然後用它把DESKeySpec轉換成
// 一個SecretKey物件
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");//DES加密和解密過程中,金鑰長度都必須是8的倍數
SecretKey secretKey = keyFactory.generateSecret(dks);
// using DES in ECB mode
Cipher cipher = Cipher.getInstance("DES/ECB/pkcs5padding");
// 用密匙初始化Cipher物件
//cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 執行加密操作
byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));
return Base64.getEncoder().encodeToString(encryptData);
}
/**
* 3DES解密
* @param encryptText 加密文字
* @return
* @throws Exception
*/
public static String decode(String encryptText) throws Exception {
// DES演算法要求有一個可信任的隨機數源
//SecureRandom sr = new SecureRandom();
// 從原始密匙資料建立一個DESKeySpec物件
DESKeySpec dks = new DESKeySpec(secretKey.getBytes());
// 建立一個密匙工廠,然後用它把DESKeySpec物件轉換成
// 一個SecretKey物件
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(dks);
// using DES in ECB mode
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 用密匙初始化Cipher物件
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 正式執行解密操作
byte[] decryptData = cipher.doFinal(Base64.getDecoder().decode(encryptText));
return new String(decryptData, encoding);
}
}
下面是使用DES加密解密的過程示例
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class DES {
public static void main(String[] args)throws Exception {
String input="巔峰小蘇";//明文
String key="zdy12345";//金鑰
String transformation="DES";//演算法
String algorithm="DES";//加密型別
String encode=encryptDES(input, key, transformation, algorithm);
System.out.println("加密:"+encode);
String ret=decryptDES(encode, key, transformation, algorithm);
System.out.println("解密:"+ret);
}
/**
* 加密
* @param input 原文
* @param key 金鑰
* @param transformation 演算法
* @param algorithm 加密型別
* @return
* @throws Exception
*/
private static String encryptDES(String input,String key,String transformation,String algorithm)throws Exception {
//建立加密物件
Cipher cipher=Cipher.getInstance(transformation);
//建立加密規則
SecretKeySpec secretKeySpec=new SecretKeySpec(key.getBytes(), algorithm);
//第一個引數是加密模式,解密模式
//第二個引數表示加密規則
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
//呼叫加密方法,引數表示原文的位元組陣列
byte[] bytes=cipher.doFinal(input.getBytes());
//位元組陣列轉換成base64編碼
String encode=Base64.encodeBase64String(bytes);
return encode;
}
/**
* 解密
* @param encryptDES 密文
* @param key
* @param transformation
* @param algorithm
* @return
* @throws Exception
*/
private static String decryptDES(String encryptDES,String key,String transformation,String algorithm)throws Exception {
Cipher cipher=Cipher.getInstance(transformation);
SecretKeySpec secretKeySpec=new SecretKeySpec(key.getBytes(),algorithm);
//Cipher.DECRYPT_MODE表示解密
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] bytes=cipher.doFinal(Base64.decodeBase64(encryptDES));
return new String(bytes);
}
}
歡迎大家閱讀,本人見識有限,寫的部落格難免有錯誤或者疏忽的地方,還望各位大佬指點,在此表示感謝。如果覺得本文章有幫助到的,點個讚唄,讓更多的閱讀者看到