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;
}