[转帖]Java 加密解密之对称加密算法PBE_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3653 | 回复: 0   主题: [转帖]Java 加密解密之对称加密算法PBE        下一篇 
Leon
注册用户
等级:少校
经验:1436
发帖:116
精华:7
注册:2013-1-4
状态:离线
发送短消息息给Leon 加好友    发送短消息息给Leon 发消息
发表于: IP:您无权察看 2013-1-10 9:13:34 | [全部帖] [楼主帖] 楼主

Java 加密解密之对称加密算法PBE

PBE是一种基于口令的加密算法,使用口令代替其他对称加密算法中的密钥,其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。

PBE算法是对称加密算法的综合算法,常见算法PBEWithMD5AndDES,使用MD5和DES算法构建了PBE算法。将盐附加在口令上,通过消息摘要算法经过迭代获得构建密钥的基本材料,构建密钥后使用对称加密算法进行加密解密。

JDK对PBE算法的支持

算法/密钥长度/默认密钥长度:

1.PBEWithMD5AndDES/56/56
2.PBEWithMD5AndTripleDES/112,168/168
3.PBEWithSHA1AndDESede/112,168/168
4.PBEWithSHA1AndRC2_40/40 to 1024/128

工作模式:CBC
填充方式:PKCS5Padding


工作模式和填充方式请参考:      JAVA加密解密基础

十六进制工具类Hex.java,见:java byte数组与十六进制字符串互转

PBE加密解密的java实现:

PBECoder.java


jave代码:

  1. import java.security.Key; 
  2. import java.security.SecureRandom; 
  3. import javax.crypto.Cipher; 
  4. import javax.crypto.SecretKeyFactory; 
  5. import javax.crypto.spec.PBEKeySpec; 
  6. import javax.crypto.spec.PBEParameterSpec; 
  7. public class PBECoder { 
  8.  
  9.  public static final String ALGORITHM = "PBEWITHMD5andDES"; 
  10.  
  11.  public static final int ITERATION_COUNT = 100; 
  12.  
  13.  
  14.  public static byte[] initSalt() throws Exception{ 
  15.  //实例化安全随机数 
  16.  SecureRandom random = new SecureRandom(); 
  17.  //产出盐 
  18.  return random.generateSeed(8); 
  19.  } 
  20.  
  21.  
  22.  private static Key toKey(String password) throws Exception{ 
  23.  //密钥材料 
  24.  PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); 
  25.  //实例化 
  26.  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); 
  27.  //生成密钥 
  28.  return keyFactory.generateSecret(keySpec); 
  29.  } 
  30.  
  31.  
  32.  public static byte[] encrypt(byte[] data,String password,byte[] salt) throws Exception{ 
  33.  //转换密钥 
  34.  Key key = toKey(password); 
  35.  //实例化PBE参数材料 
  36.  PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT); 
  37.  //实例化 
  38.  Cipher cipher = Cipher.getInstance(ALGORITHM); 
  39.  //初始化 
  40.  cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); 
  41.  //执行操作 
  42.  return cipher.doFinal(data); 
  43.  } 
  44.  
  45.  
  46.  public static byte[] decrypt(byte[] data,String password,byte[] salt)throws Exception{ 
  47.  //转换密钥 
  48.  Key key = toKey(password); 
  49.  //实例化PBE参数材料 
  50.  PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT); 
  51.  //实例化 
  52.  Cipher cipher = Cipher.getInstance(ALGORITHM); 
  53.  //初始化 
  54.  cipher.init(Cipher.DECRYPT_MODE, key, paramSpec); 
  55.  //执行操作 
  56.  return cipher.doFinal(data); 
  57.  } 
  58.  
  59.  private static String showByteArray(byte[] data){ 
  60.  if(null == data){ 
  61.  return null; 
  62.  } 
  63.  StringBuilder sb = new StringBuilder("{"); 
  64.  for(byte b:data){ 
  65.  sb.append(b).append(","); 
  66.  } 
  67.  sb.deleteCharAt(sb.length()-1); 
  68.  sb.append("}"); 
  69.  return sb.toString(); 
  70.  } 
  71.  
  72.  public static void main(String[] args) throws Exception { 
  73.  byte[] salt = initSalt(); 
  74.  System.out.println("salt:"+showByteArray(salt)); 
  75.  //这里的password需要时ASCII码,不然会报异常 
  76.  String password = "1111"; 
  77.  System.out.println("口令:"+password); 
  78.  
  79.  String data ="PBE数据"; 
  80.  System.out.println("加密前数据: string:"+data); 
  81.  System.out.println("加密前数据: byte[]:"+showByteArray(data.getBytes())); 
  82.  System.out.println(); 
  83.  byte[] encryptData = encrypt(data.getBytes(), password,salt); 
  84.  System.out.println("加密后数据: byte[]:"+showByteArray(encryptData)); 
  85.  System.out.println("加密后数据: hexStr:"+Hex.encodeHexStr(encryptData)); 
  86.  System.out.println(); 
  87.  byte[] decryptData = decrypt(encryptData, password,salt); 
  88.  System.out.println("解密后数据: byte[]:"+showByteArray(decryptData)); 
  89.  System.out.println("解密后数据: string:"+new String(decryptData)); 
  90.  
  91.  } 

    参考《java加密与解密的艺术》




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论