一、DES简介
现在相当多的分组密码都采用了Feistel网络密码结构,而DES则是Feistel网络的典型代表。Feistel网络包括平衡的Feistel网络和非平衡Feistel网络,DES加密算法则采用了较为简单的平衡网络。
二、DES加密算法过程
1. DES加密消息流程图
2. 加密具体过程
设 x = x 1 x 2 x 3 . . . . . . x 64 x = x_1 x_2 x_3 ...... x_{64} x=x1x2x3......x64 是待加密的64比特明文,其中 x i x_i xi 是 0或1的二进制比特 ( 1 < = i < = 64 ) (1<=i<=64) (1<=i<=64)。DES首先利用初始置换 ( I P ) (IP) (IP)对 x x x进行换位处理; I P IP 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次迭代(如流程图 K 1 , . . . , K 16 K_1,...,K_{16} K1,...,K16),最后经过逆初始置换 ( I P − 1 ) (IP^{-1}) (IP−1) , I P − 1 IP^{-1} 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 = y 1 y 2 y 3 . . . . . . y 64 y =y_1 y_2 y_3 ...... y_{64} y=y1y2y3......y64
PS :置换方式(如初始 I P IP IP置换),参照 I P IP IP置换表,第一次将 x = x 1 x 2 x 3 . . . . . . x 64 x = x_1 x_2 x_3 ...... x_{64} x=x1x2x3......x64 置换后得到 x ′ = x 58 x 50 x 42 . . . . . . x 7 x' = x_{58} x_{50} x_{42} ...... x_7 x′=x58x50x42......x7,然后再分为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);
}
}