对称加密之基于口令的加密解密

代码如下:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Random;

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

public class test1 {

	// 基于口令的加密
	public void PBEEnc(String s, String password) throws Exception {
		char[] passwd = password.toCharArray();
		PBEKeySpec pbks = new PBEKeySpec(passwd);
		SecretKeyFactory kf = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
		SecretKey k = kf.generateSecret(pbks);
		byte[] salt = new byte[8];
		Random r = new Random();
		r.nextBytes(salt);
		Cipher cp = Cipher.getInstance("PBEWithMD5AndDES");
		PBEParameterSpec ps = new PBEParameterSpec(salt, 1000);
		cp.init(Cipher.ENCRYPT_MODE, k, ps);
		byte ptext[] = s.getBytes("UTF8");
		byte ctext[] = cp.doFinal(ptext);
		// 将盐和加密结果合并在一起保存为密文
		FileOutputStream f = new FileOutputStream("PBEEnc.dat");
		f.write(salt);
		f.write(ctext);
		// 打印加密结果
		System.out.println("加密后密文:"+new String(ctext));

	}

	// 基于口令的解密
	public void PBEDec(String password) throws Exception {
		char[] passwd = password.toCharArray();
		PBEKeySpec pbks = new PBEKeySpec(passwd);
		SecretKeyFactory kf = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
		SecretKey k = kf.generateSecret(pbks);
		byte[] salt = new byte[8];
		FileInputStream f = new FileInputStream("PBEEnc.dat");
		f.read(salt);
		int num = f.available();
		byte[] ctext = new byte[num];
		f.read(ctext);
		Cipher cp = Cipher.getInstance("PBEWithMD5AndDES");

		PBEParameterSpec ps = new PBEParameterSpec(salt, 1000);
		cp.init(Cipher.DECRYPT_MODE, k, ps);
		byte ptext[] = cp.doFinal(ctext);
		System.out.println("解密后字符串:"+new String(ptext));
	}

	public static void main(String args[]) throws Exception {
		String str = "Hello World!";
		String passwd = "123456";
		test1 t = new test1();
		System.out.println("加密前原文:"+str);
		t.PBEEnc(str,passwd);
		t.PBEDec(passwd);
	}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值