Java DES 加密解密

1.加密的相关概念

1.明文:被隐蔽的消息称作明文(plaintext)

2.密文:隐蔽后的消息称作密文(ciphertext)

3.加密:将明文变换成密文的过程称作加密(encryption)

4.解密:由密文恢复出原明文的过程称作解密(decryption)

5.敌方:主要指非授权者,通过各种办法,窃取机密信息

6.被动攻击:获密文进行分析,这类攻击称作被动攻击(passive attack)

7.主动攻击:非法入侵者(tamper)采用篡改、伪造等手段向系统注入假消息,称为主动攻击(active attack)

8.加密算法:对明文进行加密时采用的算法

9.解密算法:对密文进行解密时采用的算法

10.加密密钥和解密密钥:加密算法和解密算法的操作通常是在一组密钥(key)的控制下进行的,分别称为加密密钥(encryption key)和解密密钥(decryption key).

在加密系统中,加密算法和密钥是最重要的两个概念。在这里需要对加密算法和密钥进行一个解释。以最简单的“恺撒加密法”为例。

《高卢战记》有描述恺撒曾经使用密码来传递信息,即所谓的“恺撒密码”。它是一种替代密码,通过将字母按顺序推后3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。如“China”可以变为“Fklqd”;解密过程相反。

在这个简单的加密方法中,“向右移位”,可以理解为加密算法;“3”可以理解为加密密钥。对于解密过程,“向左移位”,可以理解为解密算法;“3”可以理解为解密密钥。显然,密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的数据。

恺撒加密法的安全性来源于两个方面:第一,对加密算法的隐藏;第二,对密钥的隐蔽。单单隐蔽加密算法以保护信息,在学界和业界已有相当讨论,一般认为是不够安全的。公开的加密算法是给黑客长年累月攻击测试,对比隐蔽的加密算法要安全多。一般说来,加密之所以安全,是因为其加密的密钥的隐藏,并非加密解密算法的保密。而流行的一些加密解密算法一般是完全公开的。敌方如果取得已加密的数据,即使得知加密算法,若没有密钥,也不能进行解密。

2.Java密码学结构设计遵循两个原则

1.算法的独立性和可靠性

2.实现的独立想和相互作用性

算法的独立性是通过定义密码服务类来获得。用户只需了解密码算法的概念,而不用去关心如何实现这些概念。实现的独立性和相互作用性通过密码服务提供器来实现。密码服务提供器是实现一个或多个密码服务的一个或多个程序包。软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器。安装和配置提供器,可将包含提供器的ZIP和JAR文件放在CLASSPATH下,再编辑Java安全属性文件来设置定义一个提供器。

3.常见的加密算法

加密算法有很多种,一般可分为对称加密、非对称加密和单向加密三类算法。

对称加密算法过程如下:

1:发送方将明文和加密密钥一起经过加密算法处理,变成密文,发送出去。
2:接收方收到密文后,使用加密密钥及相同算法的逆算法对密文解密,恢复为明文。

非对称加密算法的基本过程是:

1:通信前,接收方随机生成的公钥,发送给发送方,自己保留私钥。
2:发送方利用接收方的公钥加密明文,使其变为密文。
3:接收方收到密文后,使用自己的私钥解密密文。

单向加密算法

该算法在加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,密文无法解密。只有重新输入明文,并经过同样的加密算法处理,得到相同的密文并被系统重新识别后,才能真正解密。

4.用Java实现DES

4.1 DES算法简介

DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

在DES中,使用了一个 56 位的密钥以及附加的8位奇偶校验位,产生最大64 位的分组大小。加密过程中,将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半。循环往复。DES 使用16个循环,但最后一个循环不交换。

4.2 java DES加密解密源码

package com.silvery.security.encrypt.impl;

import java.io.IOException;
import java.security.SecureRandom;

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

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class DESEncoder {

	private final static String DES = "DES";
     
        // 默认密钥,DES加密和解密过程中,密钥长度都必须是8的倍数
        public static String DEFAULT_KEY = "DJ!+LC$_Q.7T*&K~";

	/**
	 * Description 根据键值进行加密
	 * 
	 * @param data
	 * @param key
	 *            加密键byte数组
	 * @return
	 * @throws Exception
	 */
	public static String encrypt(String data, String key) {
		try {
			// data.getBytes()使用平台的默认字符集将此 String 编码为 byte 序列,
			// 并将结果存储到一个新的 byte 数组中。
			byte[] bt = encrypt(data.getBytes(), key.getBytes());
			String strs = new BASE64Encoder().encode(bt);
			return strs;
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}

	/**
	 * Description 根据键值进行解密
	 * 
	 * @param data
	 * @param key
	 *            加密键byte数组
	 * @return
	 * @throws IOException
	 * @throws Exception
	 */
	public static String decrypt(String data, String key) {
		if (data == null)
			return null;
		try {
			BASE64Decoder decoder = new BASE64Decoder();
			byte[] buf = decoder.decodeBuffer(data);
			byte[] bt = decrypt(buf, key.getBytes());
			return new String(bt);
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}

	/**
	 * Description 根据键值进行加密
	 * 
	 * @param data
	 * @param key
	 *            加密键byte数组
	 * @return
	 * @throws Exception
	 */
	private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
		// 生成一个可信任的随机数源
		SecureRandom sr = new SecureRandom();

		// 从原始密钥数据创建DESKeySpec对象
		DESKeySpec dks = new DESKeySpec(key);

		// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象,负责保存对称密钥
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
		SecretKey securekey = keyFactory.generateSecret(dks);

		// Cipher对象实际完成加密操作,指定其支持DES算法
		Cipher cipher = Cipher.getInstance(DES);

		// 用密钥初始化Cipher对象,ENCRYPT_MODE表示加密模式
		cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);

		// 返回密文
		return cipher.doFinal(data);
	}

	/**
	 * Description 根据键值进行解密
	 * 
	 * @param data
	 * @param key
	 *            加密键byte数组
	 * @return
	 * @throws Exception
	 */
	private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
		// 生成一个可信任的随机数源
		SecureRandom sr = new SecureRandom();
		
		// 从原始密钥数据创建DESKeySpec对象
		DESKeySpec dks = new DESKeySpec(key);
		
		// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象,负责保存对称密钥
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
		SecretKey securekey = keyFactory.generateSecret(dks);
		
		// Cipher对象实际完成解密操作,指定其支持DES算法
		Cipher cipher = Cipher.getInstance(DES);
		
		// 用密钥初始化Cipher对象,DECRYPT_MODE表示解密模式
		cipher.init(Cipher.DECRYPT_MODE, securekey, sr);

		// 返回明文
		return cipher.doFinal(data);
	}

	public static void main(String[] args) throws Exception {
		String str = "java加密与解密的实现";
		System.out.println("明文是:"+str);
		String enc = encrypt(str, DEFAULT_KEY);
		System.out.println("密文是:"+enc);
		String dec = decrypt(enc, DEFAULT_KEY);
		System.out.println("解密后的结果是:"+dec);
		
	}

}

5.参考文献

http://www.oschina.net/code/snippet_727646_18383

ChinaSEI系列讲义(By郭克华) java加密解密大全

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zerlinda_Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值