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);
}
}