`
aubdiy
  • 浏览: 697912 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多

 

Java 加密解密基础

 

Java byte数组与十六进制字符串互转

 

Java BASE64加密解密

 

Java 加密解密之消息摘要算法(MD5 SHA MAC)

 

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

 

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

 

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

 

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

 

 

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

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

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

 

JDK对DESede算法的支持

 

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

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

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;

/**
 * PBE Coder<br/>
 * Algorithm/secret key length/default secret key length/<br/>
 * 1.PBEWithMD5AndDES/56/56
 * 2.PBEWithMD5AndTripleDES/112,168/168
 * 3.PBEWithSHA1AndDESede/112,168/168
 * 4.PBEWithSHA1AndRC2_40/40 to 1024/128
 * mode:	CBC <br/>
 * padding:	PKCS5Padding
 * @author Aub
 * 
 */
public class PBECoder {

	public static final String ALGORITHM = "PBEWITHMD5andDES";
	
	public static final int ITERATION_COUNT = 100;
	
	/**
	 * 初始盐<br/>
	 * 盐的长度必须为8位
	 * @return byte[] 盐 
	 * @throws Exception
	 */
	public static byte[] initSalt() throws Exception{
		//实例化安全随机数
		SecureRandom random = new SecureRandom();
		//产出盐
		return random.generateSeed(8);
	}
	
	/**
	 * 转换密钥
	 * 
	 * @param password	密码
	 * @return Key 密钥
	 */
	private static Key toKey(String password) throws Exception{
		//密钥材料
		PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
		//实例化
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
		//生成密钥
		return keyFactory.generateSecret(keySpec);
	}
	
	/**
	 * 加密
	 * 
	 * @param data	待加密数据
	 * @param key	密钥
	 * @param salt  盐
	 * @return byte[]	加密数据
	 * @throws Exception
	 */
	public static byte[] encrypt(byte[] data,String password,byte[] salt) throws Exception{
		//转换密钥
		Key key = toKey(password);
		//实例化PBE参数材料
		PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT);
		//实例化
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		//初始化
		cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
		//执行操作
		return cipher.doFinal(data);
	}
	
	/**
	 * 解密
	 * 
	 * @param data	待机密数据
	 * @param key	密钥
	 * @param salt  盐
	 * @return byte[]	解密数据
	 * @throws Exception
	 */
	public static byte[] decrypt(byte[] data,String password,byte[] salt)throws Exception{
		//转换密钥
		Key key = toKey(password);
		//实例化PBE参数材料
		PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT);
		//实例化
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		//初始化
		cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
		//执行操作
		return cipher.doFinal(data);
	}
	
	private static String  showByteArray(byte[] data){
		if(null == data){
			return null;
		}
		StringBuilder sb = new StringBuilder("{");
		for(byte b:data){
			sb.append(b).append(",");
		}
		sb.deleteCharAt(sb.length()-1);
		sb.append("}");
		return sb.toString();
	}
	
	public static void main(String[] args) throws Exception {
		byte[] salt = initSalt();
		System.out.println("salt:"+showByteArray(salt));
		//这里的password需要是ASCII码,不然会报异常
		String password = "1111";
		System.out.println("口令:"+password);
		
		String data ="PBE数据";
		System.out.println("加密前数据: string:"+data);
		System.out.println("加密前数据: byte[]:"+showByteArray(data.getBytes()));
		System.out.println();
		byte[] encryptData = encrypt(data.getBytes(), password,salt);
		System.out.println("加密后数据: byte[]:"+showByteArray(encryptData));
		System.out.println("加密后数据: hexStr:"+Hex.encodeHexStr(encryptData));
		System.out.println();
		byte[] decryptData = decrypt(encryptData, password,salt);
		System.out.println("解密后数据: byte[]:"+showByteArray(decryptData));
		System.out.println("解密后数据: string:"+new String(decryptData));
		
	}
}

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

分享到:
评论
7 楼 aubdiy 2015-09-21  
huangningren 写道
用户密码只需要md5后就可以存入数据库了吧

如果对安全要求不高,这样做是可以的,
md5已经可以破解,可以采用加盐、多种算法多次加密等方式 提升安全性
6 楼 huangningren 2015-09-09  
用户密码只需要md5后就可以存入数据库了吧
5 楼 aubdiy 2015-03-19  
lqixv 写道
我直接运行这个程序,发现加密时间长达 300 - 500 毫秒!
解密时间大约是 1 - 5 毫秒。
加密时间太长了


System.out.println打印是比较慢的, 去掉控制台打印代码,进行测试试试
4 楼 aubdiy 2015-03-19  
lqixv 写道
我直接运行这个程序,发现加密时间长达 300 - 500 毫秒!
解密时间大约是 1 - 5 毫秒。
加密时间太长了


你好 我测试了一下,加密是慢了些,不过基本上在十几毫秒左右,如果机器好的话更快
将main方法中内容修改如下:再试试
		
public static void main(String[] args) throws Exception {
		byte[] key = initSecretKey();
		System.out.println("key:"+ showByteArray(key));
		
		String data ="DES数据";
		long t1 = System.currentTimeMillis();
		Key k = toKey(key);
		byte[] encryptData = encrypt(data.getBytes(), k);
		long t2 = System.currentTimeMillis();
		decrypt(encryptData, k);
		long t3 = System.currentTimeMillis();
		System.out.println(t2 - t1);
		System.out.println(t3 - t2);
	}
3 楼 lqixv 2015-03-18  
我直接运行这个程序,发现加密时间长达 300 - 500 毫秒!
解密时间大约是 1 - 5 毫秒。
加密时间太长了
2 楼 aubdiy 2012-01-17  
kadan_james 写道
我在测试PBEWithMD5AndDES这种算法时,发现密钥长度超过8个字节(64位,有效位56位)时任然可以加密,而且不存在超过8字节的部分截取的问题,请问能否说下有关密钥长度问题?



现在我在火车上呢,等我到家测一下。 
1 楼 kadan_james 2012-01-13  
我在测试PBEWithMD5AndDES这种算法时,发现密钥长度超过8个字节(64位,有效位56位)时任然可以加密,而且不存在超过8字节的部分截取的问题,请问能否说下有关密钥长度问题?

相关推荐

    java多种加密解密算法:SHA算法,HMAC算法,DES算法,PBE算法,AES算法,RSA算法,数字签名,D-H算法

    本文将深入探讨Java中常见的几种加密解密算法:SHA算法、HMAC算法、DES算法、PBE算法、AES算法、RSA算法、数字签名以及D-H算法。 1. SHA(Secure Hash Algorithm)算法: SHA是一种散列函数,它能将任意长度的输入...

    对称加密算法PBE(Java).rar

    对称加密算法是一种常见的数据加密技术,它使用相同的密钥进行加密和解密。在Java中,Password-Based Encryption(PBE)是对称加密的一种特殊形式,它基于密码来生成加密密钥,增强了安全性。PBE的主要优点是它允许...

    PBE是一种基于口令的加密算法,使用口令代替其他对称加密算法中的密钥,其特点在于口令由用户自己掌管,不借助任何物理媒体;

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

    java 文件加密解密 DES PBE RSA DH DSA ECC 等算法代码

    - **RSA**:由Ron Rivest、Adi Shamir和Leonard Adleman共同发明,是最常用的非对称加密算法之一。 - **DH**:Diffie-Hellman密钥交换协议,用于安全地交换加密密钥。 - **DSA**:数字签名算法,主要用于生成和验证...

    JAVA加密和解密的艺术(第二版).zip

    总的来说,这本书是Java开发者深入学习加密解密技术的宝贵资源,无论你是初学者还是有经验的开发者,都能从中受益匪浅,提升你在网络安全领域的专业技能。通过阅读这本书,你将能够更好地应对各种安全挑战,保护你的...

    Java Jct 加密解密工具包源码.rar

    WDSsoft免费源代码,java加密解密编程常用工具包 JCT 1.0,作者吴东升 常蕴秋,BlowfishTool.java封装同Blowfish对称加密算法有关的方法,包括了使用创建Blowfish密码,使用Blowfish加密、解密, 使用PBE(基于口令的...

    Java十大加密算法(对称与非对称)

    1. **AES(Advanced Encryption Standard)**:高级加密标准,是一种对称加密算法,因其高效性和安全性被广泛应用。AESUtil.java可能是实现AES加密解密功能的工具类,通常包括AES的ECB、CBC、CFB、OFB和CTR模式,...

    java与C#的PBE加密

    PBE(Password-Based Encryption)基于密码的加密是一种常见的加密方式,它结合了密钥派生函数(PBKDF)和对称加密算法,如DES(Data Encryption Standard),用于保护数据的安全。在Java和C#中,PBE提供了使用用户...

    [JAVA加解密]DES,AES,PBE,DH,RSA,ElGamal等算法实现及DataServlet实例

    首先,DES(Data Encryption Standard)是一种对称加密算法,使用56位的密钥对数据进行加密和解密。虽然它的安全性相比现代标准较低,但作为历史上的经典算法,理解其工作原理有助于理解其他加密算法。 AES...

    ava加密解密 DES PBE RSA DH DSA ECC 等算法

    1. **DES(Data Encryption Standard)**:是一种古老的对称加密算法,使用56位密钥。由于安全性较低,现在已被AES(Advanced Encryption Standard)所取代。在Java中,可以使用`javax.crypto.Cipher`类处理DES加密...

    Java加密与解密的艺术配书源代码

    文件校验209 6.8 小结211 第7章初等数据加密—对称加密算法213 7.1 对称加密算法简述213 7.2 数据加密标准—DES 214 7.3 三重DES—DESede 222 7.4 高级数据加密标准—AES 227 7.5 国际数据加密标准—IDEA 232 7.6 ...

    JAVA对称加密算法PBE定义与用法实例分析

    JAVA对称加密算法PBE定义与用法实例分析 JAVA对称加密算法PBE(Password Based Encryption,即基于口令加密)是一种常用的加密算法,它通过将口令转换为密钥,然后使用该密钥对数据进行加密。PBE算法优点在于可以...

    java 加解密算法,摘要算法和数字签名算法

    包含对称加密算法:DES,3DEA,AES,PBE 包含对称加密算法:DH,RAS,ElGamal 包含摘要算法:MD2,MD4,MD5,SHA1,SHA2(SHA-224,SHA-256,SHA-384,SHA-512) 数字签名算法:RSA,DSA,ECDSA 详情请查看:...

    java加密技术

    Java加密技术是Java编程语言中用于保障数据安全的一系列加密方法和技术,它包括了单向加密算法、对称加密算法、非对称加密算法以及加密算法的高级应用如数字签名和数字证书等。本文将详细介绍这些加密技术,并结合...

    Java 加解密技术.pdf

    在实际应用中,通常会根据需求选择合适的算法和加密方式,比如在需要高度安全性的场合,可能会使用RSA或ECC(椭圆曲线加密)进行密钥交换,在对性能要求较高的场合,可能会选择AES等对称加密算法。 通过掌握Java加...

    java加密技术大全

    3. **DES(Data Encryption Standard)**:是一种对称加密算法,它使用相同的密钥进行加密和解密,虽然现在由于其较短的密钥长度(56位)而被视为不安全,但在早期广泛使用。 4. **PBE(Password-Based Encryption...

    c#加密解密之口令加密Exe源码.rar

    - **加密过程**:使用口令和盐值生成加密密钥,然后用该密钥对数据进行对称加密,常见的对称加密算法如AES。 - **解密过程**:同样的,需要口令和盐值来重新生成相同的密钥,然后使用该密钥对已加密的数据进行解密。...

    pc1-128-java.zip_Java加密_java 加密_pc1_pc1 java

    - Java中的`javax.crypto.Cipher`类是实现加密和解密的核心类,它可以与各种加密算法配合使用,如AES、RSA等。 5. **SSL/TLS**: - 在网络通信中,Java的JSSE(Java Secure Socket Extension)提供了实现SSL/TLS...

    java 加密

    3. **RSA加密(RSACoder.java)**:RSA是一种非对称加密算法,基于大整数因子分解的困难性。它有两个密钥:公钥用于加密,私钥用于解密。在Java中,`java.security`包提供了RSA密钥对的生成和加密/解密操作。 4. **...

Global site tag (gtag.js) - Google Analytics