对称加密的两种方式

对称加密,这东东现在已经没啥用了,但据说可以帮助我了解加密思想,我还是把它弄出来了

新手心情好的话就看看吧

 

首先一个帮助类,找地址的

package zeke.security;

//路径的控制
public class PathUtil {
	

	public static String getPath() {

		String path = PathUtil.class.getResource("/").getPath();
		
		path=path.substring(1, path.length());

		return path;
	}

	

}

 

加密解密类,有两个,一个是依据系统自带算法生成key,还有一个是可以自己输入密码生成key

 

依据系统自带算法生成key

package zeke.security;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

/**
 * 对称加密密钥的生成,获取
 * 
 * @author Administrator
 */
public class SymmetricCipherWithKey {

	public static void createKey(String keyName) {

		try {

			/**
			 * Key generators for generating keys suitable for the DES, Triple
			 * DES, Blowfish, HMAC-MD5, and HMAC-SHA1 algorithms.
			 * 大概的意思可以用这些算法生成keyGenerator实例
			 */
			KeyGenerator key = KeyGenerator.getInstance("DES");

			// 初始化key;如果客户端没有显式地初始化 KeyGenerator(通过调用 init 方法)
			// ,每个提供程序必须提供(和记录)默认初始化。
			// DES-56位
			// Blowfish-32~448位
			// HMAC-MD5, and HMAC-SHA1-64位
			key.init(56);

			// 获得密钥

			SecretKey sk = key.generateKey();

			saveObject(sk, PathUtil.getPath() + "/" + keyName);

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 序列化
	 * @param obj
	 * @param fileURL
	 */
	public static void saveObject(Object obj, String fileURL) {

		try {

			FileOutputStream os = new FileOutputStream(fileURL);

			ObjectOutput oos = new ObjectOutputStream(os);

			oos.writeObject(obj);

			oos.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	// 从序列化对象中获得key对象
	public static SecretKey getKey(String keyName) {

		return (SecretKey) readerObject(PathUtil.getPath() + "/" + keyName);

	}
	
	/**
	 *反 序列化
	 * @param fileURL
	 * @return
	 */
	public static Object readerObject(String fileURL) {

		Object obj = null;

		try {

			FileInputStream fis = new FileInputStream(fileURL);

			ObjectInputStream is = new ObjectInputStream(fis);

			obj = is.readObject();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return obj;
	}

	// 对给定文本加密
	public static byte[] enCipherContent(String content, String keyName) {

		byte[] b = null;

		try {

			Cipher cipher = Cipher.getInstance("DES");

			cipher.init(Cipher.ENCRYPT_MODE, getKey(keyName));

			b = cipher.doFinal(content.getBytes());

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}

		return b;
	}

	// 解密
	public static String deCipherContent(byte[] b, String keyName) {

		String str = null;

		try {

			Cipher cipher = Cipher.getInstance("DES");

			cipher.init(Cipher.DECRYPT_MODE, getKey(keyName));

			str = new String(cipher.doFinal(b));

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}

		return str;
	}

}

 

自己输入密码生成key

package zeke.security;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;

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.DESKeySpec;

/**
 * 对称加密密钥的生成,获取
 * 
 * @author Administrator
 */
public class SymmetricCipherWithPassword {

	public static SecretKey createPassword(String password) {
		
		String pass=password;
		//需要判断pass长度,并需要长度大于8
		if(pass.length()<8){
			pass+="abcdefghijklmn";
		}

		SecretKey sk=null;
		try {

			
			DESKeySpec desKeySpec=new DESKeySpec(pass.getBytes());
			
			SecretKeyFactory skf=SecretKeyFactory.getInstance("DES");
			
			sk=skf.generateSecret(desKeySpec);
			
			
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		}
		return sk;
	}
	
	/**
	 * 序列化
	 * @param obj
	 * @param fileURL
	 */
	public static void saveObject(Object obj, String fileURL) {

		try {

			FileOutputStream os = new FileOutputStream(fileURL);

			ObjectOutput oos = new ObjectOutputStream(os);

			oos.writeObject(obj);

			oos.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	
	/**
	 *反 序列化
	 * @param fileURL
	 * @return
	 */
	public static Object readerObject(String fileURL) {

		Object obj = null;

		try {

			FileInputStream fis = new FileInputStream(fileURL);

			ObjectInputStream is = new ObjectInputStream(fis);

			obj = is.readObject();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return obj;
	}

	// 对给定文本加密
	public static byte[] enCipherContent(String content, SecretKey key) {

		byte[] b = null;

		try {

			Cipher cipher = Cipher.getInstance("DES");

			cipher.init(Cipher.ENCRYPT_MODE,key );

			b = cipher.doFinal(content.getBytes());

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}

		return b;
	}

	// 解密
	public static String deCipherContent(byte[] b, SecretKey key) {

		String str = null;

		try {

			Cipher cipher = Cipher.getInstance("DES");

			cipher.init(Cipher.DECRYPT_MODE, key);

			str = new String(cipher.doFinal(b));

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}

		return str;
	}

}

 

 

 

测试类

package zeke.security;

public class Test {
	
	public static void main(String[] args) {
		
		/*
		//................................带文件key......................................................
		
		//生成key文件
		//SymmetricCipherKey.createKey("key");
		
		//加密获得加密后的文本
		byte[] b=SymmetricCipherWithKey.enCipherContent("I like youfdf合法安家费哈斯勒", "key");
		//序列化加密文件
		SymmetricCipherWithKey.saveObject(b, PathUtil.getPath()+"/jiami.txt");
		
		//System.out.println(new String(b));
		//解密
		byte[] s=(byte[]) SymmetricCipherWithKey.readerObject(PathUtil.getPath()+"/jiami.txt");
		String str=SymmetricCipherWithKey.deCipherContent(s, "key");
		
		System.out.println(str);
		
		*/
		
		//.........................................口令.....................................................
		
		byte[] bs=SymmetricCipherWithPassword.enCipherContent("dsadadassault斤斤计较", SymmetricCipherWithPassword.createPassword("11"));
		
		String bsde=SymmetricCipherWithPassword.deCipherContent(bs, SymmetricCipherWithPassword.createPassword("11"));
		
		System.out.println(new String(bsde));
	}

}

 

 

后面还有对流进行加密,什么的,有时间也把他们封装出来。上面两个对于算法,我都是用的"DES“还有其他的,只要你再生产key和加密解密对象时重新指定就可以了,就是换个算法去算他们生成key的依据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值