使用AES算法完成对数据的加密和解密

该博客介绍了如何使用AES算法对数据进行加密和解密,展示了加密前后的字符串变化,成功还原了原始数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.alex.security;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.spec.KeySpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

public class PBESecretKeyTest {


	public static void main(String[] args) throws Exception{
		//定义需要进行加密的数据
		String data ="alex zhuang";
		System.out.println("加密前的数据为:"+data);
		//对数据进行加密
		secretEncrypt(data);
		//对数据进行解密
		secretDecrypt("D:/PBencrypted.data","D:/PBsecret.key");

	}
	
	public static void secretEncrypt(String data) throws Exception{		
		//使用PBEWithMD5AndDES算法获取Cipher实例
		Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
		//初始化密钥
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
		KeySpec keySpec = new PBEKeySpec("password".toCharArray());
		SecretKey secretKey = keyFactory.generateSecret(keySpec);
		//初始化Cipher为加密器
		PBEParameterSpec parameterSpec = new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000);		
		cipher.init(Cipher.ENCRYPT_MODE, secretKey,parameterSpec);
		
		//对数据进行加密
		byte[] encryptedData = cipher.doFinal(data.getBytes());
		
		//输出加密后的内容
		System.out.println("加密后的数据为:"+new String(encryptedData));
		
		//将密钥进行持久化和序列化
		FileOutputStream keyFos = new FileOutputStream("D:/PBsecret.key");
		ObjectOutputStream keyOos = new ObjectOutputStream(keyFos);
		keyOos.writeObject(secretKey);
		keyOos.close();
		keyFos.close();
			
			
		//将加密后的数据进行持久化
		FileOutputStream encryptedDataFos = new FileOutputStream("D:/PBencrypted.data");
		encryptedDataFos.write(encryptedData);
		encryptedDataFos.close();
	}
	
	public static void secretDecrypt(String dataPath,String keyPath) throws Exception{

		//通过IO流获得密钥和加密数据
		FileInputStream keyFis = new FileInputStream(keyPath);
		ObjectInputStream keyOis = new ObjectInputStream(keyFis);
		
		//使用PBEWithMD5AndDES算法获取Cipher实例
		Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
		//初始化密钥
		SecretKey secretKey = (SecretKey)keyOis.readObject();
		keyOis.close();
		
		//初始化Cipher为解密器
		PBEParameterSpec parameterSpec = new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000);
		cipher.init(Cipher.DECRYPT_MODE, secretKey,parameterSpec);
		
		//获得加密后的数据
		FileInputStream encryptedDataFis = new FileInputStream(dataPath);
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		copyStream(encryptedDataFis,bos);
		
		//获得解密后的数据
		byte[] decryptedData = cipher.doFinal(bos.toByteArray());
		
		bos.close();
		encryptedDataFis.close();
		
		System.out.println("解密后的数据为:"+new String(decryptedData));
		
	}
	
	public static void copyStream(FileInputStream fis ,ByteArrayOutputStream bos) throws Exception{
		byte[] buf = new byte[1024];
		int len = -1;
		while((len=fis.read(buf))!=-1){
			bos.write(buf,0,len);
		}
	}

}


运行结果:

加密前的数据为:alex zhuang
加密后的数据为:ǎ�<Q#���7��
解密后的数据为:alex zhuang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值