java 之 根据密码字符串加密示例

本文介绍了一个使用PBEWithMD5AndDES算法进行数据加密和解密的Java示例。通过设置密码和盐值,实现了对字符串“aaa”的加密,并将加密后的数据保存到文件中;随后从该文件读取数据并成功进行了解密。

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

package com.ethan.security;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

/**
 * 利用字符串 密码 产生 key
 * 
 * @author ETHAN
 * 
 */
public class PBESecretKeyTest {
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		secretEncrypt();
		secretDecrypt();
	}

	public static void secretEncrypt() {
		// 加密类
		try {
			Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");

			// 根据 设置的密码字符串得到密钥
			// SecretKey key =
			// SecretKeyFactory.getInstance("AES").generateKey(arg0);//根据
			// 设置的密码字符串得到密钥
			SecretKeyFactory keyFactory = SecretKeyFactory
					.getInstance("PBEWithMD5AndDES");
			KeySpec keySpec = new PBEKeySpec("ethanethan".toCharArray());
			SecretKey key2 = keyFactory.generateSecret(keySpec);
			// 加点盐salt,额外参数
			PBEParameterSpec parameterSpec = new PBEParameterSpec(new byte[] {
					1, 2, 3, 4, 5, 6, 7, 8 }, 1000);
			// 1->加密 2->解密 用常量 英文单词表示数字
			cipher.init(Cipher.ENCRYPT_MODE, key2, parameterSpec);

			// 填充数据
			cipher.update("aaa".getBytes());
			byte[] results = cipher.doFinal();

			System.out.println(new String(results));

			FileOutputStream fosData = new FileOutputStream("ethan_data.data");
			fosData.write(results);
			fosData.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void secretDecrypt() throws Exception {
		// PBEWithMD5AndDES 加密的一种算法
		Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");

		// 密钥
		// SecretKey key = KeyGenerator.getInstance("AES").generateKey();//得到密钥
		SecretKeyFactory keyFactory = SecretKeyFactory
				.getInstance("PBEWithMD5AndDES");
		// 拿到 密码字符串
		KeySpec keySpec = new PBEKeySpec("ethanethan".toCharArray());
		SecretKey key2 = keyFactory.generateSecret(keySpec);
		// 加点盐,额外参数
		PBEParameterSpec parameterSpec = new PBEParameterSpec(new byte[] { 1,
				2, 3, 4, 5, 6, 7, 8 }, 1000);

		// 需要第三个参数,否则会报错
		cipher.init(Cipher.DECRYPT_MODE, key2, parameterSpec);

		// 拿到 要解密的内容
		FileInputStream fisDat = new FileInputStream("ethan_data.data");

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		copyStream(fisDat, baos);

		// 解密
		byte[] result = cipher.doFinal(baos.toByteArray());

		// 记得关闭流
		fisDat.close();
		baos.close();

		System.out.println(new String(result));
	}

	private static void copyStream(InputStream ips, OutputStream ops) {
		byte[] buffer = new byte[1024];
		int len = 0;
		try {
			while ((len = ips.read(buffer)) != -1) {
				ops.write(buffer, 0, len);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值