1. 程式人生 > 其它 >使用3DES或DES對稱加密示例

使用3DES或DES對稱加密示例

技術標籤:密碼學密碼學加密解密對稱加密DES

該文章包含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);
	}
}

歡迎大家閱讀,本人見識有限,寫的部落格難免有錯誤或者疏忽的地方,還望各位大佬指點,在此表示感謝。如果覺得本文章有幫助到的,點個讚唄,讓更多的閱讀者看到