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();
}
}
}
java 之 根据密码字符串加密示例
最新推荐文章于 2023-05-25 10:33:15 发布