Java加密技术(三)对称加密算法PBE

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

PBE 

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

通过java代码实现如下:

import java.security.Key;
import java.util.Arrays;
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;

import org.apache.commons.codec.binary.Hex;

/** 对称加密PBE算法
 * @Title: PBEUtil.java
 * @Package com.somnus.cipher
 * @Description: TODO
 * @author Somnus
 * @date 2015年6月6日 上午8:57:52
 * @version V1.0
 */
public class PBEUtil {
   /**
    * 支持以下任意一种算法
    *
    * <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 keyGenerator(String password) throws Exception {
       PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
       //创建一个密匙工厂,然后用它把PBEKeySpec转换成
       SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
       SecretKey secretKey = keyFactory.generateSecret(keySpec);
       return secretKey;
   }  

   /**
    * 加密
    *
    * @param data
    *            数据
    * @param password
    *            密码
    * @param salt
    *            盐
    * @return
    * @throws Exception
    */
   public static String encrypt(String data, String password, byte[] salt) throws Exception {
       Key key = keyGenerator(password);
       PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
       // 实例化Cipher对象,它用于完成实际的加密操作
       Cipher cipher = Cipher.getInstance(ALGORITHM);
       // 初始化Cipher对象,设置为加密模式
       cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
       byte[] buff = cipher.doFinal(data.getBytes());
       System.out.println(Arrays.toString(buff));
       // 执行加密操作。加密后的结果通常都会用Base64编码进行传输
       return Hex.encodeHexString(buff);
   }  

   /**
    * 解密
    *
    * @param data
    *            数据
    * @param password
    *            密码
    * @param salt
    *            盐
    * @return
    * @throws Exception
    */
   public static String decrypt(String data, String password, byte[] salt) throws Exception {
       Key key = keyGenerator(password);
       PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
       // 实例化Cipher对象,它用于完成实际的解密操作
       Cipher cipher = Cipher.getInstance(ALGORITHM);
       //初始化Cipher对象,设置为解密模式
       cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
       // 执行解密操作
       byte[] buff = cipher.doFinal(Hex.decodeHex(data.toCharArray()));
       System.out.println(Arrays.toString(buff));
       return new String(buff);
   }

   public static void main(String[] args) throws Exception {
	   String inputStr = "Somnus";
       System.out.println("原文: " + inputStr);  

       String pwd = "efg";
       System.out.println("密码: " + pwd);  

       byte[] salt = initSalt();  

       String encryptData = encrypt(inputStr, pwd, salt);
       System.out.println("加密后: " + encryptData);  

       String decryptData = decrypt(encryptData, pwd, salt);
       System.out.println("解密后: " + decryptData);
   }
}

控制台输出:

原文: Somnus
密码: efg
[45, -91, 116, 19, -105, 95, -5, 31]
加密后: 2da57413975ffb1f
[83, 111, 109, 110, 117, 115]
解密后: Somnus

后续我们会介绍非对称加密算法,如RSA、DSA、DH、ECC等。

时间: 2024-10-06 23:40:32

Java加密技术(三)对称加密算法PBE的相关文章

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

Java 加密解密之对称加密算法AES 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.该算法

JAVA加密解密DES对称加密算法

1 下面用DES对称加密算法(设定一个密钥,然后对所有的数据进行加密)来简单举个例子. 2 3 首先,生成一个密钥KEY. 4 我把它保存到key.txt中.这个文件就象是一把钥匙.谁拥有它,谁就能解开我们的类文件.代码参考如下: 5 package com.neusoft.jiami; 6 import Java.io.File; 7 import java.io.FileOutputStream; 8 import java.security.SecureRandom; 9 import j

Java加密技术(二)——对称加密算法DES&AES

接下来我们介绍对称加密算法,最常用的莫过于DES数据加密算法. DES DES-Data Encryption Standard,即数据加密算法.是IBM公司于1975年研究成功并公开发表的.DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密. DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位. 通过java

Java加密技术(一)——BASE64与单向加密算法MD5&amp;SHA&amp;MAC

http://snowolf.iteye.com/blog/379860 加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) H

Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了. 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书. 如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Code,散列消息鉴别码)

Java加密技术(七)——非对称加密算法最高级ECC

ECC ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学,是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制.在软件注册保护方面起到很大的作用,一般的序列号通常由该算法产生. 当我开始整理<Java加密技术(二)>的时候,我就已经在开始研究ECC了,但是关于Java实现ECC算法的资料实在是太少了,无论是国内还是国外的资料,无论是官方还是非官方的解释,最终只有一种答案--ECC算法在jdk1.5后加入支持,目前仅仅只能完成密钥的生成与解析. 如果想

常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES

常用加密算法的Java实现总结(二) ——对称加密算法DES.3DES和AES 日期:2014/7/6 文:阿蜜果 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文.在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥

Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件

今天来点实际工作中的硬通货! 与计费系统打交道,少不了用到加密/解密实现.为了安全起见,通过非对称加密交换对称加密密钥更是不可或缺.那么需要通过什么载体传递非对称算法公钥/私钥信息?数字证书是公钥的载体,而密钥库可以包含公钥.私钥信息. JKS和 PKCS#12都是比较常用的两种密钥库格式/标准.对于前者,搞Java开发,尤其是接触过HTTPS平台的朋友,并不陌生. JKS文件(通常为*.jks或*.keystore,扩展名无关)可以通过Java原生工具--KeyTool生成:而后者 PKCS#

【安全加密技术】--对称加密

转载请注明出处:http://blog.csdn.net/sk719887916/article/details/46822663 上篇了解了<非对称加密>后 今天我来继续了解下加密技术中对称加密. 对称加密 对称加密是最传统的加密方式,比上非对称加密,缺少安全性,但是它依旧是用的比较多的加密方法. 对称加密采用单密钥加密方式,不论是加密还是解密都是用同一个密钥,即"一把钥匙开一把锁".对称加密的好处在于操作简单.管理方便.速度快.它的缺点在于密钥在 网络传输中容易被窃听,

Java加密技术(八)——数字证书

本篇的主要内容为Java证书体系的实现. 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法. 在构建Java代码实现前,我们需要完成证书的制作. 1.生成keyStroe文件 在命令行下执行以下命令: Shell代码   keytool -genkey -validity 36000 -alias www.zlex.org -keyalg RSA -keystore d:\zlex.keystore keytool -genkey -validity 36000 -a