Java加密系列之(四)对称加密算法

原创 2015年04月26日 11:30:42

对称加密算法,是目前应用范围最广,使用频率最高的加密算法

加密密钥=解密密钥,所以叫对称加密算法。


初等:安全性不是那么高

DES

——密钥长度不够,衍生出3重des,即3DES

AES

PBE 

IDEA


对称加密算法——DES

DES(Data Encryption Standard)数据加密标准

官方出身,98年已被破解

目前一般已不被使用,当做一些案例(教科书)或者遗留的很老的系统中还在使用

在对称加解密的发展过程中地位很高,有必要介绍下

加解密过程:

1.发送者构建密钥;

2.发送者公布密钥给接收者;

3.发送者使用密钥对数据加密;

4.发送者发送加密数据到接收者;

5.接收者使用密钥对数据解密。

package com.tvm.mrz.security.des;

import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class DESTest {

	private static String src = "Mr.Z Security Base64";

	public static void jdkDES() {
		try {
			// 生成KEY
			KeyGenerator keyGenerator = KeyGenerator.getInstance( "DES" );
			keyGenerator.init( 56 );
			SecretKey secretKey = keyGenerator.generateKey();
			byte[] bytesKey = secretKey.getEncoded();

			// KEY转换
			DESKeySpec desKeySpec = new DESKeySpec( bytesKey );
			SecretKeyFactory factory = SecretKeyFactory.getInstance( "DES" );
			SecretKey resultSecretKey = factory.generateSecret( desKeySpec );

			// 加密
			Cipher cipher = Cipher.getInstance( "DES/ECB/PKCS5Padding" );
			cipher.init( Cipher.ENCRYPT_MODE, resultSecretKey );
			byte[] result = cipher.doFinal( src.getBytes() );
			System.out.println( "JDK DES ENCRYPT: " + Hex.encodeHexString( result ) );

			// 加密
			cipher.init( Cipher.DECRYPT_MODE, resultSecretKey );
			result = cipher.doFinal( result );
			System.out.println( "JDK DES DECRYPT: " + new String( result ) );
		} catch( Exception e ) {
			e.printStackTrace();
		}
	}

	public static void bcDES() {
		try {
			Security.addProvider( new BouncyCastleProvider() );

			// 生成KEY
			KeyGenerator keyGenerator = KeyGenerator.getInstance( "DES", "BC" );
			keyGenerator.init( 56 );
			SecretKey secretKey = keyGenerator.generateKey();
			byte[] bytesKey = secretKey.getEncoded();

			// KEY转换
			DESKeySpec desKeySpec = new DESKeySpec( bytesKey );
			SecretKeyFactory factory = SecretKeyFactory.getInstance( "DES" );
			SecretKey resultSecretKey = factory.generateSecret( desKeySpec );

			// 加密
			Cipher cipher = Cipher.getInstance( "DES/ECB/PKCS5Padding" );
			cipher.init( Cipher.ENCRYPT_MODE, resultSecretKey );
			byte[] result = cipher.doFinal( src.getBytes() );
			System.out.println( "BC DES ENCRYPT: " + Hex.encodeHexString( result ) );

			// 加密
			cipher.init( Cipher.DECRYPT_MODE, resultSecretKey );
			result = cipher.doFinal( result );
			System.out.println( "BC DES DECRYPT: " + new String( result ) );
		} catch( Exception e ) {
			e.printStackTrace();
		}
	}

	public static void main( String[] args ) {
		jdkDES();
		bcDES();
	}
}



对称加密算法——3重DES

好处:

1.密钥长度增强

2.迭代次数提高

package com.tvm.mrz.security.des;

import java.security.SecureRandom;
import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;

import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class DES3Test {

	private static String src = "Mr.Z Security Base64";

	public static void jdk3DES() {
		try {
			// 生成KEY
			KeyGenerator keyGenerator = KeyGenerator.getInstance( "DESede" );
//			keyGenerator.init( 168 );
			keyGenerator.init( new SecureRandom() );
			SecretKey secretKey = keyGenerator.generateKey();
			byte[] bytesKey = secretKey.getEncoded();

			// KEY转换
			DESedeKeySpec desKeySpec = new DESedeKeySpec( bytesKey );
			SecretKeyFactory factory = SecretKeyFactory.getInstance( "DESede" );
			SecretKey resultSecretKey = factory.generateSecret( desKeySpec );

			// 加密
			Cipher cipher = Cipher.getInstance( "DESede/ECB/PKCS5Padding" );
			cipher.init( Cipher.ENCRYPT_MODE, resultSecretKey );
			byte[] result = cipher.doFinal( src.getBytes() );
			System.out.println( "JDK 3DES ENCRYPT: " + Hex.encodeHexString( result ) );

			// 加密
			cipher.init( Cipher.DECRYPT_MODE, resultSecretKey );
			result = cipher.doFinal( result );
			System.out.println( "JDK 3DES DECRYPT: " + new String( result ) );
		} catch( Exception e ) {
			e.printStackTrace();
		}
	}

	public static void bc3DES() {
		try {
			Security.addProvider( new BouncyCastleProvider() );

			// 生成KEY
			KeyGenerator keyGenerator = KeyGenerator.getInstance( "DESede", "BC" );
			keyGenerator.init( 168 );
			SecretKey secretKey = keyGenerator.generateKey();
			byte[] bytesKey = secretKey.getEncoded();

			// KEY转换
			DESedeKeySpec desKeySpec = new DESedeKeySpec( bytesKey );
			SecretKeyFactory factory = SecretKeyFactory.getInstance( "DESede" );
			SecretKey resultSecretKey = factory.generateSecret( desKeySpec );

			// 加密
			Cipher cipher = Cipher.getInstance( "DESede/ECB/PKCS5Padding" );
			cipher.init( Cipher.ENCRYPT_MODE, resultSecretKey );
			byte[] result = cipher.doFinal( src.getBytes() );
			System.out.println( "BC 3DES ENCRYPT: " + Hex.encodeHexString( result ) );

			// 加密
			cipher.init( Cipher.DECRYPT_MODE, resultSecretKey );
			result = cipher.doFinal( result );
			System.out.println( "BC 3DES DECRYPT: " + new String( result ) );
		} catch( Exception e ) {
			e.printStackTrace();
		}
	}

	public static void main( String[] args ) {
		jdk3DES();
		bc3DES();
	}
}



对称加密算法——AES

AES是目前使用最多的对称加密算法

通常用于移动通信系统加密以及基于SSH协议的软件。如:SSH Client、secureCRT

特点:

高级

DES替代者

package com.tvm.mrz.security.aes;

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

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

public class AESTest {

	private static String src = "Mr.Z Security AES";

	public static void jdkAES() {
		try {
			// 生成KEY
			KeyGenerator keyGenerator = KeyGenerator.getInstance( "AES" );
			keyGenerator.init( 128 );
			SecretKey secretKey = keyGenerator.generateKey();
			byte[] bytesKey = secretKey.getEncoded();

			// KEY转换
			Key key = new SecretKeySpec( bytesKey, "AES" );

			// 加密
			Cipher cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" );
			cipher.init( Cipher.ENCRYPT_MODE, key );
			byte[] result = cipher.doFinal( src.getBytes() );
			System.out.println( "JDK AES ENCRYPT: " + Base64.encodeBase64String( result ) );

			// 加密
			cipher.init( Cipher.DECRYPT_MODE, key );
			result = cipher.doFinal( result );
			System.out.println( "JDK AES DECRYPT: " + new String( result ) );
		} catch( Exception e ) {
			e.printStackTrace();
		}
	}

	public static void bcAES() {
		// TODO
		// 和DES的bc实现都类似
	}

	public static void main( String[] args ) {
		jdkAES();
		bcAES();
	}
}



对称加密算法——PBE

AES、DES和3重DES在使用上比较一致

PBE是一个另类,它综合了消息摘要算法和对称加密算法的优点,形成了一个特殊的对称加密算法

PBE(Password Based Encryption)基于口令加密

对已有算法的包装,如PBEWithMD5AndDES

加解密过程:

1.发送者构建口令;

2.发送者公布口令给接收者;

3.发送者构建盐;

4.发送者使用口令、盐对数据加密;

5.发送者发送盐、加密数据到接收者;

6.接收者使用口令、盐对数据解密。

package com.tvm.mrz.security.pbe;

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;

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

public class PBETest {

	private static String src = "Mr.Z Security PBE";

	public static void jdkPBE() {
		try {
			// 初始化盐
			SecureRandom random = new SecureRandom();
			byte[] salt = random.generateSeed( 8 );

			// 口令与密钥
			String password = "Mr.Z";
			PBEKeySpec pbeKeySpec = new PBEKeySpec( password.toCharArray() );
			SecretKeyFactory factory = SecretKeyFactory.getInstance( "PBEWithMD5AndDES" );
			Key key = factory.generateSecret( pbeKeySpec );

			// 加密
			PBEParameterSpec pbeParameterSpec = new PBEParameterSpec( salt, 100 );
			Cipher cipher = Cipher.getInstance( "PBEWithMD5AndDES" );
			cipher.init( Cipher.ENCRYPT_MODE, key, pbeParameterSpec );
			byte[] result = cipher.doFinal( src.getBytes() );
			System.out.println( "jdk pbe ENCRYPT:" + Base64.encodeBase64String( result ) );

			// 解密
			cipher.init( Cipher.DECRYPT_MODE, key, pbeParameterSpec );
			result = cipher.doFinal( result );
			System.out.println( "jdk pbe DECRYPT:" + new String( result ) );
		} catch( Exception e ) {
			e.printStackTrace();
		}
	}

	public static void main( String[] args ) {
		jdkPBE();
	}
}




“Ceph浅析”系列之四Ceph的结构

本文将从逻辑结构的角度对Ceph进行分析。 4.1    Ceph系统的层次结构         Ceph存储系统的逻辑层次结构如下图所示[1]。         自下向上,可以将Ceph系统...
  • qq_24916117
  • qq_24916117
  • 2015年12月30日 20:42
  • 548

HDU 不容易系列之(4)——考新郎(组合错排)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2049 思想基础:全部元素错排参见http://blog.csdn.net/liuweiyuxiang/a...
  • liuweiyuxiang
  • liuweiyuxiang
  • 2016年04月03日 23:43
  • 688

Java加密-对称加密算法

本位内容来自JAVA实现对称加密Java加密-对称加密算法对称加密算法是加密密钥等于解密密钥。常见的对称加密算法有: DES,3DES AES PBE IDEA DESDES(Data Encrypt...
  • winfredzen
  • winfredzen
  • 2016年12月12日 10:00
  • 1087

深入理解Spring系列之七:web应用自动装配Spring配置

在《深入理解Spring系列之一:开篇》的示例代码中使用如下方式去加载Spring的配置文件并初始化容器。ApplicationContext applicationContext = new Cla...
  • tianruirui
  • tianruirui
  • 2017年08月10日 20:42
  • 285

C#游戏编程:《控制台小游戏系列》之《三、游戏输入模块》

一、输入模块结构      游戏输入模块包括对鼠标和键盘两种输入设备的处理,此模块主要为游戏框架提供鼠标操作和键盘操作能力,这些功能均以事件形式提供从而达到模块间消息传递的目的。 ...
  • fa6507
  • fa6507
  • 2013年01月26日 20:30
  • 3075

强化学习系列之四:模型无关的策略学习

文章目录 [隐藏] 1. 一些前置话题 2. MC Control 3. SARSA 4. Q Learning 5. 做点实验 5.1. 算法稳定性 5.2. 贪婪策略...
  • bbbeoy
  • bbbeoy
  • 2018年01月16日 10:27
  • 17

Wireshark入门与进阶系列四之过滤语法

0x00 前言     我们都知道,wireshark可以实现本地抓包,同时Wireshark也支持remote packet capture protocol(rpcapd)协议远程抓包,只要在远...
  • qq_29277155
  • qq_29277155
  • 2016年07月30日 20:24
  • 1516

MongoDB初探系列之四:MongoDB与Java共舞

由于版本不同,可能API也有所不同,本次学习用的是3.0版本。 1、使用的mongodb的jdbc驱动版本为:mongo-java-driver-3.0.0.jar 2、本节只是简单介绍JDBC操作,...
  • zhaoguoshuai91
  • zhaoguoshuai91
  • 2015年08月01日 22:13
  • 1256

“Ceph浅析”系列之四——Ceph的工作原理及流程

原文在 http://yizhaolingyan.net/?p=63, 感谢作者 @一棹凌烟         本文将对Ceph的工作原理和若干关键工作流程进行扼要介绍。如前所述,由于Ceph的...
  • scaleqiao
  • scaleqiao
  • 2015年06月08日 17:09
  • 1212

XenServer 6.5实战系列之四:XenServer 6.5 Installation

1. Installation Methods1.1 Xen Server 6.5 支持以下3中安装方法:From a CD (本次通过在VMware Workstation中演示此方法)Set up...
  • stephenh1991
  • stephenh1991
  • 2017年09月01日 13:47
  • 105
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java加密系列之(四)对称加密算法
举报原因:
原因补充:

(最多只允许输入30个字)