📄 simpledes.java
字号:
import java.io.IOException;
public class SimpleDes
{
public static int[] toBit(byte a)//生成一个字符的二进制
{
int e;
int[] k=new int[8];
for(int i=0;i<8;i++)
{
e=a>>i;
k[i]=e&1;
}
return k;
}
public static void BitPrint(int[] B)//输出二进制系列
{for(int i=B.length-1;i>=0;i--)
System.out.print(B[i]);
}
public static int[] p8(int[] k)//p8置换函数
{
int[] p2={6,3,7,4,8,5,10,9};
int[] key=new int[8];
for(int i=0;i<8;i++)
key[i]=k[p2[i]-1];
return key;
}
public static void ls1(int[] m,int i,int j)//循环左移一位函数
{
int temp;
temp=m[j-1];
for(int k=j-1;k>i-1;k--)
m[k]=m[k-1];
m[i-1]=temp;
}
public static int[] p10(int[] key)//p10函数
{
int[] p1={3,5,2,7,4,10,1,9,8,6};
int[] temp=new int[10];
for(int i=0;i<10;i++)
temp[i]=key[p1[i]-1];
return temp;
}
public static int[] ip(int[] mw)//ip函数
{
int[] ips={2,6,3,1,4,8,5,7};
int[] bmw=new int[8];
for(int i=0;i<8;i++)
{
bmw[i]=mw[ips[i]-1];
}
return bmw;
}
public static int[] ip_1(int[] mw)//ip逆函数
{
int[] ips={4,1,3,5,7,2,8,6};
int[] bmw=new int[8];
for(int i=0;i<8;i++)
{
bmw[i]=mw[ips[i]-1];
}
return bmw;
}
public static int[] fk(int[] mw,int[] key){//fk函数
int[] bmv=new int[8];
int[] L=new int[4];
int[] R=new int[4];
int[] LF=new int[4];
bmv=mw;
for(int i=0;i<4;i++)
L[i]=mw[i];
for(int i=4;i<8;i++)
R[i-4]=mw[i];
LF=f(R,key);
for(int i=0;i<4;i++)
L[i]=L[i]^LF[i];
for(int i=0;i<4;i++)
bmv[i]=L[i];
return bmv;
}
public static int[] f(int[] R,int[] SK)//f函数
{
int[][] s0={{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2}};
int[][] s1={{0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3}};
int[] temp={4,1,2,3,2,3,4,1};
int[] t={2,4,3,1};
int[] EP=new int[8];
int[] ts1=new int[4];
int[] ts2=new int[4];
int r,c;
for(int i=0;i<8;i++)
EP[i]=R[temp[i]-1];
for(int i=0;i<8;i++)
EP[i]=EP[i]^SK[i];
r=EP[0]*2+EP[3];
c=EP[1]*2+EP[2];
ts1[0]=s0[c][r]%2;
ts1[1]=s0[c][r]/2;
r=EP[4]*2+EP[7];
c=EP[5]*2+EP[6];
ts1[2]=s0[c][r]%2;
ts1[3]=s0[c][r]/2;
for(int i=0;i<4;i++)
ts2[i]=ts1[t[i]-1];
return ts2;
}
public static void sw(int[] mw)//sw函数,交换左右四位
{
int temp;
for(int i=0;i<4;i++)
{temp=mw[i];
mw[i]=mw[i+4];
mw[i+4]=temp;
}
}
public static void main(String args[])
{
byte[] buffer1=new byte[512];
byte[] buffer2=new byte[512];
byte c1,c2,c3;
int count=0;
int[] mw=new int[8];
int[] bmw=new int[8];
int[] sw1=new int[8];
int[] sw2=new int[8];
int[] sw3=new int[10];
int[] key1=new int[8];
int[] key2=new int[8];
System.out.println("请输入明文系列(本程序仅处理前8个)");
try {
count=System.in.read(buffer1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(count>8) count=8;
System.out.println("你输入明文的二进制为:");
for(int i=0;i<count;i++)
{
c1=buffer1[i];
mw=toBit(c1);
BitPrint(mw);
System.out.print(" ");
}
System.out.println();
System.out.println("请输入密钥(前2个有效)");
try{
count=System.in.read(buffer2);
}catch(IOException e)
{
e.printStackTrace();
}
c2=buffer1[0];
c3=buffer2[1];
sw1=toBit(c2);
sw2=toBit(c3);
for(int i=0;i<10;i++)
{
if(i<5)
sw3[i]=sw1[i];
else
sw3[i]=sw2[i-5];
}
System.out.println();
System.out.println("生产密钥的二进制(10位)为:");
BitPrint(sw3);
System.out.println();
sw3=p10(sw3);
ls1(sw3,1,5);
ls1(sw3,6,10);
key1=p8(sw3);
System.out.println("产生第一个密钥的二进制为:");
BitPrint(key1);
System.out.println();
ls1(sw3,1,5);
ls1(sw3,6,10);
ls1(sw3,1,5);
ls1(sw3,6,10);
key2=p8(sw3);
System.out.println("产生第二个密钥的二进制为:");
BitPrint(key2);
System.out.println();
System.out.println("S-DES算法开始......");
System.out.println("明 文 列 -->密 文 列-->明 文 列");
count=buffer1.length ;
if(buffer1.length >8) count=8;
for(int i=0;i<count;i++)
{
mw=toBit(buffer1[i]);
BitPrint(mw);
System.out.print(" ");
System.out.print("-->");
bmw=ip(mw);
bmw=fk(bmw,key1);
sw(bmw);
bmw=fk(bmw,key2);
bmw=ip_1(bmw);
BitPrint(bmw);
System.out.print(" ");
System.out.print("-->");
mw=ip(bmw);
mw=fk(mw,key2);
sw(mw);
mw=fk(mw,key1);
mw=ip_1(mw);
BitPrint(mw);
System.out.println();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -