⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s_des.java

📁 DES是种抗密码分析更强的加密方法,尽管DES的安全强度一直是个争论的话题.现今在金融行业已十分流行. java实现的简单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 + -