文档章节

对称加密算法-PBE算法

王爵nice
 王爵nice
发布于 2015/03/31 18:29
字数 1702
阅读 66
收藏 0

一、简述

  PBE算法(Password Base Encryption,基于口令加密)算法是一种基于口令的加密算法。特点在于口令由用户自己掌握,采用随机数(我们这里叫做 盐)杂凑多重加密等方法保证数据的安全性。

  PBE算法没有密钥的概念,把口令当做密钥了。因为密钥长短影响算法安全性,还不方便记忆,这里我们直接换成我们自己常用的口令就大大不同了,便于我们的记忆。但是单纯的口令很容易被字典法给穷举出来,所以我们这里给口令加了点“盐”,这个盐和口令组合,想破解就难了。

同时我们将盐和口令合并后用消息摘要算法进行迭代很多次来构建密钥初始化向量的基本材料,使破译更加难了。

  PBE算法没构建新的加密算法,就是用了我们常用的对称加密算法,例如AES,DES等算法。

 

 

二、模型分析

这里我们还是假设甲乙双发要传递消息,需要口令和盐还有算法

传统的对称加密算法就是,构建密钥,指定算法,然后发送数据前用密钥加密数据,密钥和加密后的数据一起发送给对方,对方拿着密钥对数据进行解密。

 现在是密钥没有了,我们就用“口令+盐”构造出一个密钥,然后对数据进行加密

 这里“口令”我们可以随便设置,都可以设置成我们开自己电脑的密码

 这里“盐”的设置可以采用随机数,可以是甲乙双方约定的数据

 最终我们的口令和盐都要公布给双方

1、消息传递双方约定口令,这里甲方构建口令

2、甲方构建口令后,公布给乙方

3、由口令构建方(甲方)构建本次消息传递使用的盐,其实也可以双方约定一个数据,例如硬盘号,今天的日期等等,不一定非要写个安全算法计算出来,只要双方一致就行

4、甲方使用口令、盐对数据加密

5、甲方将盐、加密数据发送给消息接收者(乙方)

6、乙方用收到的口令、盐(可以是约定的数据)对数据进行解密

 

总体看来口令和盐两边都需要知道。消息传递过程还是需要指定双方的统一算法进行。而这些算法其实还是用的那些常见的对称加密算法

三、java6和bouncycastle支持的算法列表

 

算法 密钥长度 密钥长度默认值 工作模式 填充方式 备注

PBEWithMD5AndDES 56 56 CBC PKCS5Padding java6实现

PBEWithMD5AndTripeDES 112、168 168 CBC PKCS6Padding java7实现

PBEWithSHA1AndDESede 112、168 168 CBC PKCS7Padding java8实现

PBEWithSHA1AndRC2_40 40至1024 128 CBC PKCS8Padding java9实现

PBEWithMD5AndDES 64 64 CBC PKCS5Padding/PKCS7Padding/ISO10126Padding/ZeroBytePadding BouncyCastle实现

PBEWithMD5AndRC2 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10127Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHA1AndDES 64 64 CBC PKCS5Padding/PKCS7Padding/ISO10128Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHA1AndRC2 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10129Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHAAndIDEA-CBC 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10130Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHAAnd2-KeyTripleDES-CBC 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10131Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHAAnd3-KeyTripleDES-CBC 192 192 CBC PKCS5Padding/PKCS7Padding/ISO10132Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHAAnd128BitRC2-CBC 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10133Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHAAnd40BitRC2-CBC 40 40 CBC PKCS5Padding/PKCS7Padding/ISO10134Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHAAnd128BitRC4 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10135Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHAAnd40BitRC4 40 40 CBC PKCS5Padding/PKCS7Padding/ISO10136Padding/ZeroBytePadding BouncyCastle实现

PBEWithSHAAndTwofish-CBC 256 256 CBC PKCS5Padding/PKCS7Padding/ISO10137Padding/ZeroBytePadding BouncyCastle实现

四、程序展示

package com.ca.test;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.apache.commons.codec.binary.Base64;
/**
 * 对称加密算法:基于口令加密-PBE算法实现
 * 使用java6提供的PBEWITHMD5andDES算法进行展示
 * @author kongqz
 * */
public class PBECoder {
	
	/**
	 * JAVA6支持以下任意一种算法
	 * PBEWITHMD5ANDDES
	 * PBEWITHMD5ANDTRIPLEDES
	 * PBEWITHSHAANDDESEDE
	 * PBEWITHSHA1ANDRC2_40
	 * PBKDF2WITHHMACSHA1
	 * */
	public static final String ALGORITHM="PBEWITHMD5andDES";
	
	/**
	 * 迭代次数
	 * */
	public static final int ITERATION_COUNT=100;
	
	/**
	 * 盐初始化
	 * 盐长度必须为8字节
	 * @return byte[] 盐
	 * */
	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);
		//生成密钥
		SecretKey secretKey=keyFactory.generateSecret(keySpec);
		
		return secretKey;
	}
	/**
	 * 加密
	 * @param data 待加密数据
	 * @param password 密码
	 * @param salt 盐
	 * @return byte[] 加密数据
	 * 
	 * */
	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 password 密码
	 * @param salt 盐
	 * @return byte[] 解密数据
	 * 
	 * */
	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);
	}
	/**
	 * 使用PBE算法对数据进行加解密
	 * @throws Exception 
	 * 
	 */
	public static void main(String[] args) throws Exception {
		//待加密数据
		String str="PBE";
		//设定的口令密码
		String password="azsxdc";
		
		System.out.println("原文:/t"+str);
		System.out.println("密码:/t"+password);
		
		//初始化盐
		byte[] salt=PBECoder.initSalt();
		System.out.println("盐:/t"+Base64.encodeBase64String(salt));
		//加密数据
		byte[] data=PBECoder.encrypt(str.getBytes(), password, salt);
		System.out.println("加密后:/t"+Base64.encodeBase64String(data));
		//解密数据
		data=PBECoder.decrypt(data, password, salt);
		System.out.println("解密后:"+new String(data));
	}
}
控制台结果输出:
原文:	PBE
密码:	azsxdc
盐:	VeEQqRzOw2Y=
加密后:	7bQTon5WD04=
解密后:PBE

五、总结

 

PBE不是一个新构建的算法,就是将密钥的概念转成 “口令+盐” 的方式,将不便于记忆的密钥转成便于记忆的口令

算法还是用的基本的对称加密算法,从上边的支持表中就能看到。

 

这个是不是和我们到银行开的U盾有些像呢?

就拿民生银行的U盾来说,我们插上U盾,还需要我们去输入口令。然后才能到网上银行去登陆操作,付款的时候还是需要我们去输入口令。

1、U盾的盐从何来?:应该是那个闪盘的序列编号经过一定的处理得出的一个值,因为我们想要U盾生效,在民生的大厅中需要找一个机器激活的。那个激活的动作应该是将我们U盾这个闪盘中的数据写入到我们个人的账户中,相当于做了一次盐的公布

2、口令何来?:就是我们设定的登陆密码呀。这个在窗口办理的时候需要我们设定U盾的密码。并且我们在激活的时候可以改我们的密码

 

有了上边两个,我们再进行操作,就可以进行我们的身份发送数据的安全性了。网银的数据交换真的安全了...


© 著作权归作者所有

王爵nice

王爵nice

粉丝 286
博文 72
码字总数 72355
作品 5
浦东
程序员
私信 提问
Java加密技术(三)——PBE算法

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

mrliuze
2015/05/27
0
0
各种Java加密算法

如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authe...

mifans
2016/11/08
42
0
文本加密解密工具--ImmediateCrypt

ImmediateCrypt 可方便的使用 AES-256 算法对纯文本消息进行加密解密的工具。 支持的加密算法包括: AES-256 cipher CBC block chaining PKCS#5 PBE PKCS#5 padding...

匿名
2012/07/07
1K
0
打造属于你的加密Helper类

摘要 在我们软件系统设计中,数据的安全性是我们考虑的重中之重,特别像银行系统的设计账户和密码都需进行加密处理。这时我们可以使用加密算法对数据进行加密处理,这就是我们今天要介绍的主...

长平狐
2012/06/11
166
0
媒体宣传的量子加密的概念有错误

目前我国在量子信息学领域的进步很大,媒体也是大加报道,但我发现有些新闻稿的关于量子加密的描述有误,比如:量子计算机可破解当前使用的所有加密算法。 加密算法分为对称加密和非对称加密...

haierccc1
2017/06/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【redis】spring boot利用redis的Keyspace Notifications实现消息通知

前言 需求:当redis中的某个key失效的时候,更新key对应数据在数据库的状态 1、修改redis.conf 安装的redis服务默认是: notify-keyspace-events "",修改成 notify-keyspace-events Ex; 位置...

时刻在奔跑
刚刚
0
0
IT基础设施中的人工智能可以改变工作的方式

  如今,减少人工智能的宣传和炒作已成为IT领导者的主要工作。提供有关人工智能在何处以及如何将其添加到IT基础设施的深入指南将会提供帮助。   很多技术提供商正在投入巨资,将人工智能...

琴殇的
刚刚
0
0
vue cli3创建测试打包环境(通过development、production、alpha指定不同的接口地址)

参考地址 前言:项目一般有开发环境,测试环境,生产环境;vue cli内置有开发和生产环境,可以用process.env.NODE_ENV区分,有时候我们和后台同事需要本地连接调试代码,又需要连接测试环境调...

hkaikai
7分钟前
0
0
360安全浏览器龙芯、飞腾、兆芯版

主页https://browser.360.cn/se/linux/ 龙芯 http://down.360safe.com/gc/browser360-cn-stable-10.0.2001.0-1.mips64el.rpm http://down.360safe.com/gc/browser360-cn-stable_10.0.2001.0......

gugudu
7分钟前
8
0
访问JSP时,浏览器显示为

问题: <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param>......

器石_
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部