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

来源:互联网 发布:.com域名申请 编辑:程序博客网 时间:2024/06/05 22:50
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 stubsecretEncrypt();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 blocke.printStackTrace();}}}