一、简介:
现在相当多的分组密码都采用了Feistel网络密码结构,而DES则是Feistel网络的典型代表。Feistel网络包括平衡的Feistel网络和非平衡Feistel网络,DES加密算法则采用了较为简单的平衡网络。

二、DES加密算法过程:
整个过程可以概括为下图:
这里写图片描述


可以概括为:设x=x1x2x3......x64x = x_1 x_2 x_3 ...... x_{64} 是待加密的64比特明文,其中xix_i
0或1的二进制比特(1<=i<=64)(1<=i<=64).DES首先利用初始置换IP对x进行换位处理;如下表(IP):


| 1 | 2 | 3 | 4| 5| 6| 7| 8| 9| 10| 11| 12| 13| 14| 15| 16|
| ------------- |:-------------😐 -----😐
|58|50|12|34|26|18|10|2|60|52|44|36|28|20|12|4|
|62|54|46|38|30|22|14|6|64|56|48|40|32|24|16|8|
|57|49|41|33|25|17|9|1|59|51|43|35|27|19|11|3|
|61|53|45|37|29|21|13|5|63|55|47|39|31|23|15|7|


然后再进行与密钥相关的16次迭代,最后经过逆初始置换IP -1 (如下表:)


| 1 | 2 | 3 | 4| 5| 6| 7| 8| 9| 10| 11| 12| 13| 14| 15| 16|
| ------------- |:-------------😐 -----😐
|40|8|48|16|56|24|64|32|39|7|47|15|55|23|63|31|
|38|6|46|14|54|22|62|30|37|5|45|13|53|21|61|29|
|36|4|44|12|52|20|60|28|35|3|43|11|51|19|59|27|
|34|2|42|10|50|18|58|26|33|1|41|9|49|17|57|25|


的处理得到密文y=y1y2y3......y64y =y_1 y_2 y_3 ...... y_{64}

PS :置换方式(如初始IP置换)第一次即将x=x1x2x3......x64x = x_1 x_2 x_3 ...... x_{64} 置换后得到x=x58x50x42......x7x' = x_{58} x_{50} x_{42} ...... x_7,然后再分为L和R各32位的左右两块


三、JAVA的实现

package com.encrypted.cipher;

import org.apache.commons.codec.binary.Hex;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class En_DES {
	//JDK 提供的DES加密算法
	public void jdkDES(String msg){
		try{
			//生成Key
			KeyGenerator keygenerate = KeyGenerator.getInstance("DES");
			keygenerate.init(56);
			SecretKey secretkey = keygenerate.generateKey();
			byte [] bytesecret= secretkey.getEncoded();
			
			//加密
			SecretKey secretKey = new SecretKeySpec(bytesecret,"DES");
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.ENCRYPT_MODE, secretKey);
			byte[] result = cipher.doFinal(msg.getBytes());
			
			System.out.println("JDK_DES加密结果:" +Hex.encodeHexString(result));
			
			//解密
			cipher.init(Cipher.DECRYPT_MODE, secretKey);
			result = cipher.doFinal(result);
			
			System.out.println("JDK_DES解密结果:" + new String(result));
			System.out.println();
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	
}

package com.encrypted.cipher;

public class Encrypt_Demo {

	public static String message = "这是一个明文";
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		En_DES des = new En_DES();
		des.jdkDES(message);
	}

}