JAVA加密解密之PBE算法

简介:

PBE(Password Based Encryption,基于口令加密)是一种基于口令的加密算法,其特点是使用口令代替了密钥,而口令由用户自己掌管,采用随机数杂凑多重加密等方法保证数据的安全性。PBE算法在加密过程中并不是直接使用口令来加密,而是加密的密钥由口令生成,这个功能由PBE算法中的KDF函数完成。KDF函数的实现过程为:将用户输入的口令首先通过“盐”(salt)的扰乱产生准密钥,再将准密钥经过散列函数多次迭代后生成最终加密密钥,密钥生成后,PBE算法再选用对称加密算法对数据进行加密,可以选择DES、3DES、RC5等对称加密算法。

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Random;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

/**
 * PBE(Password-based encryption,基于密码验证)<br>
 * 其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。是一种简便的加密方式。
 * 
 * @author jianggujin
 * 
 */
public class PBECoder
{

   /**
    * PEB
    * 
    * @author jianggujin
    * 
    */
   public enum PEB
   {
      PBEWithMD5AndDES, PBEWithMD5AndTripleDES, PBEWithSHA1AndDESede, PBEWithSHA1AndRC2_40
   }

   /**
    * 盐初始化
    * 
    * @return
    * @throws Exception
    */
   public byte[] initSalt()
   {
      byte[] salt = new byte[8];
      Random random = new Random();
      random.nextBytes(salt);
      return salt;
   }

   /**
    * 转换密钥
    * 
    * @param peb
    *           PEB算法
    * @param password
    *           密码
    * @return
    * @throws NoSuchAlgorithmException
    * @throws InvalidKeySpecException
    * @throws Exception
    */
   private Key toKey(PEB peb, char[] password) throws NoSuchAlgorithmException,
         InvalidKeySpecException
   {
      PBEKeySpec keySpec = new PBEKeySpec(password);
      SecretKeyFactory keyFactory = SecretKeyFactory
            .getInstance(peb.toString());
      SecretKey secretKey = keyFactory.generateSecret(keySpec);
      return secretKey;
   }

   /**
    * 加密
    * 
    * @param peb
    *           PEB算法
    * @param data
    *           加密数据
    * @param password
    *           密码
    * @param salt
    *           盐
    * @return
    * @throws InvalidKeySpecException
    * @throws NoSuchAlgorithmException
    * @throws NoSuchPaddingException
    * @throws InvalidAlgorithmParameterException
    * @throws InvalidKeyException
    * @throws BadPaddingException
    * @throws IllegalBlockSizeException
    */
   public byte[] encrypt(PEB peb, byte[] data, char[] password, byte[] salt)
         throws NoSuchAlgorithmException, InvalidKeySpecException,
         NoSuchPaddingException, InvalidKeyException,
         InvalidAlgorithmParameterException, IllegalBlockSizeException,
         BadPaddingException
   {
      Key key = toKey(peb, password);
      PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
      Cipher cipher = Cipher.getInstance(peb.toString());
      cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
      return cipher.doFinal(data);
   }

   /**
    * 解密
    * 
    * @param peb
    *           PEB算法
    * @param data
    *           解密数据
    * @param password
    *           密码
    * @param salt
    *           盐
    * @return
    * @throws InvalidKeySpecException
    * @throws NoSuchAlgorithmException
    * @throws NoSuchPaddingException
    * @throws InvalidAlgorithmParameterException
    * @throws InvalidKeyException
    * @throws BadPaddingException
    * @throws IllegalBlockSizeException
    */
   public byte[] decrypt(PEB peb, byte[] data, char[] password, byte[] salt)
         throws NoSuchAlgorithmException, InvalidKeySpecException,
         NoSuchPaddingException, InvalidKeyException,
         InvalidAlgorithmParameterException, IllegalBlockSizeException,
         BadPaddingException
   {
      Key key = toKey(peb, password);
      PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
      Cipher cipher = Cipher.getInstance(peb.toString());
      cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
      return cipher.doFinal(data);

   }
}
目录
相关文章
|
Java 数据安全/隐私保护
Java实现最电话号码的简单加密源码
Java实现最电话号码的简单加密源码
15 0
|
Java 数据安全/隐私保护
java实现加密电话号码,有具体的加密流程注释
java实现加密电话号码,有具体的加密流程注释
19 0
|
22天前
|
存储 算法 Java
Java数据结构与算法-java数据结构与算法(二)
Java数据结构与算法-java数据结构与算法
63 1
|
16天前
|
搜索推荐 Java
Java排序算法
Java排序算法
18 0
|
16天前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
22 4
|
19天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
32 0
|
22天前
|
XML 存储 算法
Java数据结构与算法-java数据结构与算法(五)
Java数据结构与算法-java数据结构与算法
47 0
|
28天前
|
安全 Java 数据安全/隐私保护
提升 Java 编程安全性 - 代码加密混淆工具的重要性和应用
提升 Java 编程安全性 - 代码加密混淆工具的重要性和应用
|
28天前
|
安全 小程序 Java
java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现
java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现
17 0
|
30天前
|
算法 搜索推荐 Java
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
13 1