java 对象加密_java.security包实现对象加密

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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值