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

   }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值