📄 des.java
字号:
public class DES {
//DES的中的S-BOX
private byte[][] sbox1=
{
{14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7},
{0, 15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8},
{4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0},
{15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13}
};
private char[][] sbox2=
{
{15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10},
{3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5},
{0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15},
{13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9}
};
private char[][] sbox3=
{
{10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8},
{13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1},
{13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7},
{1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12}
};
private char [][] sbox4=
{
{7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15},
{13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9},
{10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4},
{3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14}
};
private char[][] sbox5=
{
{2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9},
{14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6},
{4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14},
{11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3}
};
private char [][]sbox6=
{
{ 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11},
{ 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8},
{ 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6},
{ 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13}
};
private char [][]sbox7=
{
{ 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1},
{ 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6},
{ 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2},
{ 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12}
};
private char [][]sbox8=
{
{ 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7},
{ 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2},
{ 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8},
{ 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11}
};
byte[][] Lpart=new byte[4][8];
byte[][] Rpart=new byte[4][8];
//声明一个三维数组用来存储加密过程产生的16个密码
byte[][][] saveK=new byte[16][8][6];
public void encrypt(Text text){
byte[] byteArray=new byte[8];
byte[][]C=new byte[4][7];
byte[][]D=new byte[4][7];
byte[] byteArray2=new byte[8];
//这里byte[0]保存char[0]的高位字节,byte[1]保存了char[0]的低位字节
char [] charArray=text.getPlainText();
for(int i=0;i<8;i++){
byteArray[i]=Change.charToByte(charArray[i/2])[i%2];
}
//将byteArray中的位取出并扩展成字节放在bitArray中
byte[][] bitArray={Change.bitToByteArray(byteArray[0]),
Change.bitToByteArray(byteArray[1]),
Change.bitToByteArray(byteArray[2]),
Change.bitToByteArray(byteArray[3]),
Change.bitToByteArray(byteArray[4]),
Change.bitToByteArray(byteArray[5]),
Change.bitToByteArray(byteArray[6]),
Change.bitToByteArray(byteArray[7])};
//完成初始置换IP
bitArray=IP(bitArray);
//将bitArray分配给2个数组Lpart和Rpart
for(int i=0;i<8;i++)
for(int j=0;j<8;j++){
if(i<4)
Lpart[i][j]=bitArray[i][j];
else
Rpart[i-4][j]=bitArray[i][j];
}
//**********对文本1中输入的处理结束************
// ***************对文本2输入的处理******************
//获得从文本2中输入的字符串,并将其存储在字符数组中
//和以上同理
char [] charArray2=text.getKey();
for(int i=0;i<8;i++){
byteArray2[i]=Change.charToByte(charArray2[i/2])[i%2];
}
byte[][] bitArray2={Change.bitToByteArray(byteArray2[0]),
Change.bitToByteArray(byteArray2[1]),
Change.bitToByteArray(byteArray2[2]),
Change.bitToByteArray(byteArray2[3]),
Change.bitToByteArray(byteArray2[4]),
Change.bitToByteArray(byteArray2[5]),
Change.bitToByteArray(byteArray2[6]),
Change.bitToByteArray(byteArray2[7])};
//bitArray2经过PC1
bitArray2=PC1(bitArray2);
// 将bitArray2经过PC1后的数组拆分成2组
for(int i=0;i<8;i++)
for(int j=0;j<7;j++){
if(i<4)
C[i][j]=bitArray2[i][j];
else
D[i-4][j]=bitArray2[i][j];
}
// *****************文本2的处理结束*****************
byte[][]temp;
for(int i=0;i<16;i++){
// 用临时数组temp保存明文右半部分
temp=(byte[][])Rpart.clone();
// 向左移1位的情况
if(i==0||i==1||i==8||i==15){
LS(C);
LS(D);
}
// 向左移动2位的情况
else{
LS(C);
LS(C);
LS(D);
LS(D);
}
//明文右半部分Rpart扩展成48位
Rpart=expandByte(Rpart);
//异或1
XOR(Rpart,PC2(C,D));
//在一个数组中存储K1-K16以便解密使用
saveK[i]=(PC2(C,D));
//经过SBOX
Rpart=SBOX(Rpart);
//经过置换
Rpart=Perm(Rpart);
//经过异或2
XOR2(Lpart,Rpart);
//新的左边是原来的右边
Lpart=temp;
}//for结束
// 左右两部分合并然后最终置换,由于最后一次循环之后左边和右边进行了一次交换,所以这里参数的顺序是Rpart在前Lpart在后
byte[][] result=IP2(Rpart,Lpart);
// 转化为字节,然后转化为字符
char[] array=new char[4];
byte[]b=new byte[2];
for(int i=0;i<8;i++){
b[i%2]=Change.byteToBitArray(result[i]);
array[(int)(i/2)]= Change.byteToChar(b);
}
text.setCipherText(new String(array));
}
public void decrypt(Text text){
// ********************解密过程*****************
byte[][] temp2;
for(int i=15;i>-1;i--){
temp2=(byte[][])Lpart.clone();
//扩展Lpart
Lpart=expandByte(Lpart);
//经过异或1
XOR(Lpart,saveK[i]);
//经过SBOX
Lpart=SBOX(Lpart);
//经过置换Perm
Lpart=Perm(Lpart);
//经过异或2和交换
XOR2(Rpart,Lpart);
Rpart=temp2;
}//for结束
//左右两部分合并然后最终置换
byte[][] result3=IP2(Lpart,Rpart);
char[] array=new char[4];
byte[]b=new byte[2];
for(int i=0;i<8;i++){
b[i%2]=Change.byteToBitArray(result3[i]);
array[(int)(i/2)]= Change.byteToChar(b);
}
}//解密结束
// ***************plaintext处理部分***************
//初始置换IP
public byte[][] IP(byte[][] b){
byte[][]temp=new byte[8][8];
for(int i=0;i<8;i++)
for(int j=0;j<8;j++){
if(i<4)
temp[i][j]=b[7-j][i*2+1];
else
temp[i][j]=b[7-j][(i-4)*2];
} //for结束
return temp;
}//ip结束
//扩展ExpandByte
public byte[][] expandByte(byte[][] temp){
byte[][] bbb=new byte[8][6];
//扩展数组exRpt的第0列
bbb[0][0]=temp[3][7];
bbb[1][0]=temp[0][3];
bbb[2][0]=temp[0][7];
bbb[3][0]=temp[1][3];
bbb[4][0]=temp[1][7];
bbb[5][0]=temp[2][3];
bbb[6][0]=temp[2][7];
bbb[7][0]=temp[3][3];
//扩展数组b的第1~4列
for(int i=0;i<8;i++)
for(int j=1;j<5;j++){
if(i==0)
bbb[i][j]=temp[i][j-1];
else if(i==1)
bbb[i][j]=temp[i-1][j+3];
else if(i==2)
bbb[i][j]=temp[i-1][j-1];
else if(i==3)
bbb[i][j]=temp[i-2][j+3];
else if(i==4)
bbb[i][j]=temp[i-2][j-1];
else if(i==5)
bbb[i][j]=temp[i-3][j+3];
else if(i==6)
bbb[i][j]=temp[i-3][j-1];
else if(i==7)
bbb[i][j]=temp[i-4][j+3];
}
//扩展数组b的第5列
bbb[0][5]=temp[0][4];
bbb[1][5]=temp[1][0];
bbb[2][5]=temp[1][4];
bbb[3][5]=temp[2][0];
bbb[4][5]=temp[2][4];
bbb[5][5]=temp[3][0];
bbb[6][5]=temp[3][4];
bbb[7][5]=temp[0][0];
return bbb;
}//扩展结束
//Rpart和K的异或
public void XOR(byte[][]c,byte[][]d){
for(int i=0;i<8;i++)
for(int j=0;j<6;j++)
c[i][j]^=d[i][j];
}
// SBOX
public byte[][] SBOX(byte[][]temp){
byte[][]xxx=new byte[4][8];
int m;
int n;
byte[][] yyy=new byte[4][2];
for (int i=0;i<8;i++){
m=temp[i][0]*2+temp[i][5];
n=temp[i][1]*8+temp[i][2]*4+temp[i][3]*2+temp[i][4];
if(i==0)
yyy[0][0]=(byte)sbox1[m][n];
else if(i==1)
yyy[0][1]=(byte)sbox2[m][n];
else if(i==2)
yyy[1][0]=(byte)sbox3[m][n];
else if(i==3)
yyy[1][1]=(byte)sbox4[m][n];
else if(i==4)
yyy[2][0]=(byte)sbox5[m][n];
else if(i==5)
yyy[2][1]=(byte)sbox6[m][n];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -