📄 s_des.java
字号:
/*
* S_DES.java
*
* Created on 2007年12月3日, 下午4:27
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
import java.io.*;
/**
*
* @author yanyanyinan
*/
public class S_DES {
/**
* Creates a new instance of S_DES
*/
public S_DES() {
}
private void innital(){
IP10 = new int[10];
IP10[0]=2;IP10[1]=4;IP10[2]=1;IP10[3]=6;IP10[4]=3;IP10[5]=9;
IP10[6]=0;IP10[7]=8;IP10[8]=7;IP10[9]=5;//{3,5,2,7,4,10,1,9,8,6}
IP8 = new int[8];
IP8[0]=5;IP8[1]=2;IP8[2]=6;IP8[3]=3;IP8[4]=7;IP8[5]=4;IP8[6]=9;IP8[7]=8;//{6,3,7,4,8,5,10,9}
IP = new int[8];
IP[0]=1;IP[1]=5;IP[2]=2;IP[3]=0;IP[4]=3;IP[5]=7;IP[6]=4;IP[7]=6;//{2,6,3,1,4,8,5,7}
IP4 = new int[4];
IP4[0]=1;IP4[1]=3;IP4[2]=2;IP4[3]=0;//{2,4,3,1}
IP_1 = new int[8];
IP_1[0]=3;IP_1[1]=0;IP_1[2]=2;IP_1[3]=4;IP_1[4]=6;IP_1[5]=1;IP_1[6]=7;IP_1[7]=5;//{4,1,3,5,7,2,8,6}
s0=new int[4][4]; s1=new int[4][4];
s0[0][0] = 1; s0[0][1] = 0; s0[0][2] = 3; s0[0][3] = 2;
s0[1][0] = 3; s0[1][1] = 2; s0[1][2] = 1; s0[1][3] = 0;
s0[2][0] = 0; s0[2][1] = 2; s0[2][2] = 1; s0[2][3] = 3;
s0[3][0] = 3; s0[3][1] = 1; s0[3][2] = 3; s0[3][3] = 2;
s1[0][0] = 0; s1[0][1] = 1; s1[0][2] = 2; s1[0][3] = 3;
s1[1][0] = 2; s1[1][1] = 0; s1[1][2] = 1; s1[1][3] = 3;
s1[2][0] = 3; s1[2][1] = 0; s1[2][2] = 1; s1[2][3] = 0;
s1[3][0] = 2; s1[3][1] = 1; s1[3][2] = 0; s1[3][3] = 3;
}
private char[] permute(String key){
char[] k = key.toCharArray();
for(int i = 0;i<IP10.length;i++){
k[i] = key.charAt(IP10[i]);
}
return k;
}
private char[] LS1(char[] key){
char le = key[0], ri = key[5];
int count = key.length/2;
for(int i=0;i<count-1;i++){
key[i] = key[i+1];
key[i+count] = key[i+count+1];
}
key[count-1] = le;
key[key.length-1] = ri;
char[] k = new char[IP8.length];
for(int i=0;i<k.length;i++)
k[i] = key[IP8[i]];
return k;
}
private char[] LS2(char[] key){
char l1=key[0],l2=key[1],r1=key[5],r2=key[6];
int count = key.length/2;
for(int i=0;i<count-2;i++){
key[i] = key[i+2];
key[i+count] = key[i+count+2];
}
key[count-2] = l1;key[count-1] = l2;
key[key.length-2] = r1;key[key.length-1] = r2;
char[] k = new char[IP8.length];
for(int i=0;i<k.length;i++)
k[i] = key[IP8[i]];
return k;
}
private byte encrypt(byte pl){
String p = "";
if(pl<0) p = Integer.toBinaryString(256+pl);
else p = Integer.toBinaryString(pl);
int l = 8-p.length();
for(int i=0;i<l;i++){
p = "0"+p;
}
char[] data = p.toCharArray();
int le = data.length/2;
char[] left = new char[le];char[] right = new char[le];
for(int i=0;i<data.length;i++)
data[i] = p.charAt(IP[i]);
for(int i = 0;i<le;i++){
left[i] = data[i];
right[i] = data[i+le];
}
left = encrypt(left,right,k1);
right = encrypt(right,left,k2);
String cipher = new String(right)+new String(left);
for(int i=0;i<data.length;i++)
data[i] = cipher.charAt(IP_1[i]);
cipher = new String(data);
byte b = (byte)Integer.parseInt(cipher,2);
//if(b<0) b = 256 - b;
return b;
}
private char[] encrypt(char[] l,char[] r,char[] k){
char[] EP = new char[8]; int[] P = new int[8];
EP[0] = r[3]; EP[1] = r[0]; EP[2] = r[1]; EP[3] = r[2];//4123
EP[4] = r[1]; EP[5] = r[2]; EP[6] = r[3]; EP[7] = r[0];//2341
char tt = '0';
for(int i=0;i<k.length;i++)
P[i] = (EP[i] + k[i] - tt - tt)%2;
String rl = Integer.toBinaryString(s0[P[0]*2+P[3]][P[1]*2+P[2]]);
String rr = Integer.toBinaryString(s1[P[4]*2+P[7]][P[5]*2+P[6]]);
String result = rl.length()<2?"0"+rl:rl;
result = result.concat(rr.length()<2?"0"+rr:rr);
char[] re = result.toCharArray();
for(int i=0;i<re.length;i++)
re[i] = result.charAt(IP4[i]);
for(int i=0;i<l.length;i++)
l[i] = (char)((l[i] + re[i] - tt - tt)%2 + tt);
return l;
}
private byte decrypt(byte e){
String c = "";
if(e<0) c = Integer.toBinaryString(256+e);
else c = Integer.toBinaryString(e);
int l = 8-c.length();
for(int i=0;i<l;i++){
c = "0"+c;
}
char[] data = c.toCharArray();
int le = data.length/2;
char[] left = new char[le];char[] right = new char[le];
for(int i=0;i<data.length;i++){
data[i] = c.charAt(IP[i]);}
for(int i = 0;i<le;i++){
left[i] = data[i];
right[i] = data[i+le];
}
left = encrypt(left,right,k2);
right = encrypt(right,left,k1);
String plaintext = new String(right)+new String(left);
for(int i=0;i<data.length;i++)
data[i] = plaintext.charAt(IP_1[i]);
plaintext = new String(data);
return (byte)Integer.parseInt(plaintext,2);
}
public static void main(String[] args) {
// TODO code application logic here
S_DES soft = new S_DES();
if(args.length==4){
soft.Encryption(args);
}
else
System.out.println("请输入命令如:java S_DES -e 254 srcplaint.txt ciphertext.txt 或\n java S_DES -d 254 ciphertext.txt destplaintext.txt");
}
public void Encryption(String[] args){
key = Integer.toBinaryString(Integer.parseInt(args[1]));
int len = key.length();
for(int i=0;i<10-len;i++)
key = "0"+key;
innital();
char[] k = permute(key);
k1 = LS1(k);
k2 = LS2(k);
try{
File ip = new File(args[2]); File op = new File(args[3]);
FileInputStream bi = new FileInputStream(ip);
FileOutputStream po = new FileOutputStream(op);
byte m;
if(args[0].equals("-e")){
while((m=(byte)bi.read())!=-1){
m = encrypt(m);
po.write(m);
}
System.out.println("加密成功"+m);
}
if(args[0].equals("-d")){
while((m=(byte)bi.read())!=-1){
m = decrypt(m);
po.write(m);
}
System.out.println("解密成功");
}
bi.close();
po.close();
}catch(IOException e){e.printStackTrace();}
}
String key;
char[] k1;
char[] k2;
int[][] s0;
int[][] s1;
int IP[];
int IP10[];
int IP8[];
int IP4[];
int IP_1[];
FileInputStream bi;
FileOutputStream po;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -