一、简介:
现在相当多的分组密码都采用了Feistel网络密码结构,而DES则是Feistel网络的典型代表。Feistel网络包括平衡的Feistel网络和非平衡Feistel网络,DES加密算法则采用了较为简单的平衡网络。
二、DES加密算法过程:
整个过程可以概括为下图:
可以概括为:设 是待加密的64比特明文,其中 是
0或1的二进制比特.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|
的处理得到密文
PS :置换方式(如初始IP置换)第一次即将 置换后得到,然后再分为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);
}
}