前两篇分别讲了对称加密中两种简单的方式——基于代码直接加密与密钥存盘的方式;今天来看一下对称加密中的另一种方式——基于口令的加密与解密,就是根据您设定的密码来加密,这种方式跟前面的一样,也分为基于代码直接加密与密钥存盘的方式,现在为了方便,两种方式就一起写了不再分开写了。
package com.study.security2; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; /** * * @ClassName: SimpleTest3 * @Description: 基于口令的加密与解密 * @author 我夕 * @date 2012-5-16 */ public class SimpleTest3 { public static void main(String[] args) throws Exception { //直接在代码中进行加密与解密的方式 simpleSecret(); // 简单密钥加密2,将密钥写到磁盘 simpleSecret2(); } /** * 直接在代码中进行加密与解密的方式 */ public static void simpleSecret() throws Exception { // PBEWithMD5AndDES是一个算法的名称,关于其他具体的算法名称大家可以查看文档 Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");// 创建对象实例 // SecretKeyFactory.getInstance("PBEWithMD5AndDES")中的参数必须与Cipher.getInstance("PBEWithMD5AndDES")相同 // PBEKeySpec(char[] password) 长度必须为8个字节 SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec("12345678".toCharArray())); // PBEParameterSpec 是PKCS #5 标准中所定义的基于密码的加密法构造一个参数集合 PBEParameterSpec parameterSpec = new PBEParameterSpec(new byte[] { 1,2, 3, 4, 5, 6, 7, 8 }, 10); cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec); // 初始化 byte[] result = cipher.doFinal("hello java !".getBytes()); System.out.println("加密后的数据:"+new String(result)); // 解密 cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec); System.out.println("解密后的数据:"+new String(cipher.doFinal(result))); } /** * 密钥数据写到磁盘的方式 */ public static void simpleSecret2() throws Exception { // 密钥加密 Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");// 创建对象实例 SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec("22345678".toCharArray())); // 将产生的密钥写到磁盘上 FileOutputStream foskey = new FileOutputStream("myKey.key"); ObjectOutputStream oos = new ObjectOutputStream(foskey); oos.writeObject(key); oos.close(); foskey.close(); PBEParameterSpec parameterSpec = new PBEParameterSpec(new byte[] { 1,2, 3, 4, 5, 6, 7, 8 }, 10); cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec); // 初始化 byte[] result = cipher.doFinal("How are you !".getBytes()); System.out.println("加密后的数据:"+new String(result)); // 将加密后的数据写到磁盘上 FileOutputStream fosData = new FileOutputStream("myData.data"); fosData.write(result); fosData.close(); // **密钥解密*// simpleDecrypt(); } // 密钥解密方法一 public static void simpleDecrypt() throws Exception { // 从磁盘读进密钥 FileInputStream fiskey = new FileInputStream("myKey.key"); ObjectInputStream oiskey = new ObjectInputStream(fiskey); Key key = (Key) oiskey.readObject(); oiskey.close(); fiskey.close(); // 从磁盘读进数据 FileInputStream fisDat = new FileInputStream("myData.data"); // 读二进制数据 ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); int len = 0; byte[] data = new byte[1024]; while ((len = fisDat.read(data)) != -1) { arrayOutputStream.write(data, 0, len); } byte[] result = arrayOutputStream.toByteArray(); arrayOutputStream.close(); fisDat.close(); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");// 创建对象实例 PBEParameterSpec parameterSpec = new PBEParameterSpec(new byte[] { 1,2, 3, 4, 5, 6, 7, 8 }, 10); cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec); // 初始化 byte[] data2 = cipher.doFinal(result); System.out.println("解密后的数据:"+new String(data2)); } }
运行结果: