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