原视频地址 Imooc_JAVA实现对称加密4-1 JAVA-对称加密算法PBE
package PBE; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import org.apache.commons.codec.binary.Hex; import Base64.Base64; public class PBE { private static String src = "imooc security pbe"; public static void main(String[] args) { jdkPBE(); }//main方法结束 private static void jdkPBE(){ try { /*盐值就是在密码hash过程中添加的额外的随机值,如,用户的ID就可以作为盐值, 来进行hash,生产密文,进而,可以做到密码保护的目的 */ //初始化盐(口令):加密的随机数或字符串 通过随机数random来产生盐 //SecureRandom提供加密的强随机数生成器 (RNG) SecureRandom random = new SecureRandom(); byte[] salt = random.generateSeed(8);//返回给定的种子字节数量,该数量可使用此类用来为其自身提供种子的种子生成算法来计算。 //加密 首先定义密码 //口令与密钥 String password = "jluzh"; //通过PBEKeySpec类实例化一个能够把 盐 密码 口令转为密钥 的对象pbeKeySpec //PBEKeySpec可以将密码视为某种原始密钥内容,由此加密机制使用其导出一个密钥 PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray()); //SecretKeyFactory类秘密密钥的工厂。 密钥工厂用来将密钥(类型 Key 的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示形式) //getInstance返回转换指定算法的秘密密钥的 SecretKeyFactory 对象 //algorithm参数 - 所请求的秘密密钥算法的标准名称 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES"); //通过factory 的generateSecret 生成Key 根据提供的密钥规范(密钥材料)生成 SecretKey 对象 keySpec - 秘密密钥的规范(密钥材料) // generateSecret()参数为秘钥材料desKeySpec 该生成我们所需要的秘钥 Key key = factory.generateSecret(pbeKeySpec); //加密 //实例化一个PBE的参数的输入材料 为 PKCS #5 标准中所定义的基于密码的加密法构造一个参数集合。 //salt - salt。复制该 salt 的内容来防止后续修改。 iterationCount - 迭代计数。 PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt,100); //KEY转换完之后 Cipher类的实例来进行加密和解密操作 //getInstance("加解密算法/工作方式/填充方式") //Cipher此类为加密和解密提供密码功能 Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES"); //cipher.init(opmode, certificate); 第一个参数为模式 第二个参数为转换后的KEY // Cipher.ENCRYPT_MODE加密模式 转换后的KEY:convertsecretKey cipher.init(Cipher.ENCRYPT_MODE, key,pbeParameterSpec); //doFinal(input); input即使要被加密的内容 byte[] result = cipher.doFinal(src.getBytes()); System.out.println("jdk pbe encrypt:"+org.apache.commons.codec.binary.Base64.encodeBase64String(result)); //解密 //cipher.init(opmode, certificate); 第一个参数为模式 第二个参数为转换后的KEY // Cipher.ENCRYPT_MODE解密模式 转换后的KEY:convertsecretKey cipher.init(Cipher.DECRYPT_MODE, key,pbeParameterSpec); result = cipher.doFinal(result); System.out.println("jdk pbe decrypt:"+new String(result)); } catch (Exception e) { e.printStackTrace(); } } }//PBE类结束