随笔 - 64  文章 - 9  trackbacks - 0
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(6)

我参与的团队

随笔分类(88)

随笔档案(92)

文章分类(142)

文章档案(182)

天基成员

学习园

我的海角

搜索

  •  

积分与排名

  • 积分 - 180879
  • 排名 - 318

最新评论


    除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE

    PBE

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

    通过java代码实现如下:

import java.security.Key;   
import java.util.Random;   
  
import javax.crypto.Cipher;   
import javax.crypto.SecretKey;   
import javax.crypto.SecretKeyFactory;   
import javax.crypto.spec.PBEKeySpec;   
import javax.crypto.spec.PBEParameterSpec;   
  
/**  
 * PBE安全编码组件 
http://www.bt285.cn   http://www.5a520.cn 
 *   
 * 
@author 梁栋  
 * 
@version 1.0  
 * 
@since 1.0  
 
*/
  
public abstract class PBECoder extends Coder {   
    
/**  
     * 支持以下任意一种算法  
     *   
     * <pre>  
     * PBEWithMD5AndDES   
     * PBEWithMD5AndTripleDES   
     * PBEWithSHA1AndDESede  
     * PBEWithSHA1AndRC2_40  
     * </pre>  
     
*/
  
    
public static final String ALGORITHM = "PBEWITHMD5andDES";   
  
    
/**  
     * 盐初始化  
     *   
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static byte[] initSalt() throws Exception {   
        
byte[] salt = new byte[8];   
        Random random 
= new Random();   
        random.nextBytes(salt);   
        
return salt;   
    }
   
  
    
/**  
     * 转换密钥<br>  
     *   
     * 
@param password  
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
private static Key toKey(String password) throws Exception {   
        PBEKeySpec keySpec 
= new PBEKeySpec(password.toCharArray());   
        SecretKeyFactory keyFactory 
= SecretKeyFactory.getInstance(ALGORITHM);   
        SecretKey secretKey 
= keyFactory.generateSecret(keySpec);   
  
        
return secretKey;   
    }
   
  
    
/**  
     * 加密  
     *   
     * 
@param data  
     *            数据  
     * 
@param password  
     *            密码  
     * 
@param salt  
     *            盐  
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static byte[] encrypt(byte[] data, String password, byte[] salt)   
            
throws Exception {   
  
        Key key 
= toKey(password);   
  
        PBEParameterSpec paramSpec 
= new PBEParameterSpec(salt, 100);   
        Cipher cipher 
= Cipher.getInstance(ALGORITHM);   
        cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);   
  
        
return cipher.doFinal(data);   
  
    }
   
  
    
/**  
     * 解密  
     *   
     * 
@param data  
     *            数据  
     * 
@param password  
     *            密码  
     * 
@param salt  
     *            盐  
     * 
@return  
     * 
@throws Exception  
     
*/
  
    
public static byte[] decrypt(byte[] data, String password, byte[] salt)   
            
throws Exception {   
  
        Key key 
= toKey(password);   
  
        PBEParameterSpec paramSpec 
= new PBEParameterSpec(salt, 100);   
        Cipher cipher 
= Cipher.getInstance(ALGORITHM);   
        cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);   
  
        
return cipher.doFinal(data);   
  
    }
   
}
 

    再给出一个测试类:

import static org.junit.Assert.*;   
  
import org.junit.Test;   
  
/**  
 *   
 * 
@author 梁栋  http://www.5a520.cn http://www.feng123.com
 * 
@version 1.0  
 * 
@since 1.0  
 
*/
  
public class PBECoderTest {   
  
    @Test  
    
public void test() throws Exception {   
        String inputStr 
= "abc";   
        System.err.println(
"原文: " + inputStr);   
        
byte[] input = inputStr.getBytes();   
  
        String pwd 
= "efg";   
        System.err.println(
"密码: " + pwd);   
  
        
byte[] salt = PBECoder.initSalt();   
  
        
byte[] data = PBECoder.encrypt(input, pwd, salt);   
  
        System.err.println(
"加密后: " + PBECoder.encryptBASE64(data));   
  
        
byte[] output = PBECoder.decrypt(data, pwd, salt);   
        String outputStr 
= new String(output);   
  
        System.err.println(
"解密后: " + outputStr);   
        assertEquals(inputStr, outputStr);   
    }
   
  
}

    控制台输出:

    原文: abc

    密码: efg

    加密后: iCZ0uRtaAhE=

    解密后: abc

posted on 2009-12-19 10:20 鹏凌 阅读(312) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: