java.security包实现对象加密

原创
2013/12/17 22:20
阅读数 1.5K

    Java原生支持常见的加密算法,例如DES、RSA。随便写点关于Java安全包的东西。

    Java.security.Provider对象官方的解释是:实现了 Java 安全性的一部分或者全部。    

    provider 可能实现的服务包括:算法(如 DSA、RSA、MD5 或 SHA-1),密钥的生成、转换和管理设施(如用于特定于算法的密钥)。

    每个 provider 有一个名称和一个版本号,并且在每个它装入运行时中进行配置。

    可以通过如下语句查看本地JDK提供的provider类型:

for(Provider p : Security.getProviders()){
	System.out.println(p+" "+p.getInfo());
}



    javax.crypto.KeyGenerator对象作为对称密钥生成器,JavaAPI当中给出的解释是:密钥生成器是使用此类的某个 getInstance 类方法构造的。


    KeyGenerator 对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个 KeyGenerator 对象来生成更多的密钥。生成密钥的方式有两种:与算法无关的方式和特定于算法的方式。不多啰嗦,可以查看API文档,当中强调了一点:如果客户端没有显式地初始化 KeyGenerator(通过调用 init 方法),那么每个提供者都必须提供(并记录)默认初始化。

    javax.crypto.SecretKey对称表示密钥。

    javax.crypto.spec.IvParameterSpec,此类指定一个初始化向量 (IV)。使用 IV 的例子是反馈模式中的密码,如,CBC 模式中的 DES 和使用 OAEP 编码操作的 RSA 密码。

    javax.crypto.Cipher此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心。API中的解释是:为创建 Cipher 对象,应用程序调用 Cipher 的getInstance 方法并将所请求转换的名称传递给它。还可以指定提供者的名称(可选)。
转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作)。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案。
转换具有以下形式:
    “算法/模式/填充”或
    “算法”
    (后一种情况下,使用模式和填充方案特定于提供者的默认值)。例如,以下是有效的转换:
    Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");

    好了,基本的对象介绍完了,下面来看看代码:

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Provider;
import java.security.Security;

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

import sun.misc.BASE64Decoder;


public class JavaSecurity {
	
	public static void main(String[] args) {
		JavaSecurity js = new JavaSecurity();
		String test = "keep foolish , keep hungry";
		String entryString = js.encrypt(test);
		System.out.println(entryString);
		String decryptString = js.decrypt(entryString);
		System.out.println(decryptString);
	}
	public JavaSecurity(){
		try {
			this.init();
		} catch (NoSuchAlgorithmException | NoSuchProviderException
				| UnsupportedEncodingException | NoSuchPaddingException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * init()
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchProviderException
	 * @throws UnsupportedEncodingException
	 * @throws NoSuchPaddingException
	 */
	public void init() throws NoSuchAlgorithmException, NoSuchProviderException, UnsupportedEncodingException, NoSuchPaddingException{
		//密钥生成器
		keyGenerator = KeyGenerator.getInstance("DES", "SunJCE");
		//对称密钥
		key = keyGenerator.generateKey();
		//加解密时的初始化向量 8bytes
		iv = new IvParameterSpec("87654321".getBytes("utf-8"));
		//DES加密算法,CBC反馈模式,PKCSPadding的填充方案
		cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
		
	}
	/**
	 * 加密
	 * @param str
	 * @return
	 * @throws InvalidKeyException
	 * @throws InvalidAlgorithmParameterException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 */
	public String encrypt(String str) {
		String returnStr = "";
		try {
			cipher.init(Cipher.ENCRYPT_MODE, key , iv);
		} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		byte[] strByte = str.getBytes();
		//加密
		byte[] encryStr = null;
		try {
			encryStr = cipher.doFinal(strByte);
		} catch (IllegalBlockSizeException | BadPaddingException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		returnStr = new sun.misc.BASE64Encoder().encode(encryStr);
		return returnStr;
		
	}
	
	/**
	 * 解密
	 * @param str
	 * @return
	 * @throws InvalidKeyException
	 * @throws InvalidAlgorithmParameterException
	 * @throws IOException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 */
	public String decrypt(String str) {
		String returnStr = "";
		try {
			cipher.init(Cipher.DECRYPT_MODE, key, iv);
		} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		byte[] strByte = null;
		try {
			strByte = new BASE64Decoder().decodeBuffer(str);
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		byte[] returnStrByte = null;
		try {
			returnStrByte = cipher.doFinal(strByte);
		} catch (IllegalBlockSizeException | BadPaddingException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		returnStr = new String(returnStrByte);
		return returnStr;
	}


	/**
	 * 密钥生成器
	 */
	private KeyGenerator keyGenerator;
	/**
	 * 对称密钥
	 * */
	private SecretKey key;
	/**
	 * 加解密时的初始化向量 8bytes
	 * */
	private IvParameterSpec iv;
	/**
	 * cipher
	 * */
	private Cipher cipher;
}





展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部