/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package des;
import java.util.Scanner;
/**
*
* @author Gulnur
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Enter plaintext (64 bit): ");
int plaintextArray [] = new int[64];
for(int i = 0; i < 64; i++){
plaintextArray[i]=in.nextInt();
}
System.out.println("Enter key (64 bit): ");
int keyArray[] = new int[64];
for(int i = 0; i < 64; i++){
keyArray[i] = in.nextInt();
}
boolean bufferBit[]= getBool(plaintextArray);
boolean bufferBitKey[] = getBool(keyArray);
boolean pl_n[] = getInitialPerm(bufferBit);
boolean leftPart[] = getLeft(pl_n);
boolean rightPart[] = getRight(pl_n);
boolean keyAfterPC1[];
boolean keyPC2[];
boolean expanPerm[];
boolean fX[];
boolean one[];
boolean two[];
boolean three[];
boolean four[];
boolean five[];
boolean six[];
boolean seven[];
boolean eight[];
boolean afterSBox[];
boolean n_right[];
boolean permP[];
boolean keyPC1[] = getPermKeyPC1(bufferBitKey);
int rd;
for(int i = 1; i < 17; i++ ){
if(i == 1 || i==2 || i == 9 || i == 16){rd=1;}
else rd=2;
keyAfterPC1 =keyGenerator(keyPC1, rd);
keyPC2 = getPermPC2(keyAfterPC1);
expanPerm = expansionPerm(rightPart);
fX = firstXOR(expanPerm, keyPC2);
one= getFirst(fX);
two= getSecond(fX);
three= getThird(fX);
four= getFourth(fX);
five= getFifth(fX);
six= getSixth(fX);
seven= getSeventh(fX);
eight= getEight(fX);
afterSBox =SBox(one,two,three,four,five,six,seven,eight);
permP = permutationP(afterSBox);
n_right = secondXOR(permP, leftPart);
leftPart = rightPart;
rightPart = n_right;
keyPC1 = keyAfterPC1;
}
boolean concat[] = new boolean[64];
for(int i = 0; i < 32; i++){
concat[i]=rightPart[i];
concat[i+32]=leftPart[i];
}
concat=getInversePermutation(concat);
int cipherText[] = getFinal(concat);
int count = 0;
for(int i= 0; i < 64; i++){
System.out.print(cipherText[i] +"\t ");
count++;
if(count%8==0){System.out.println(" ");}
}
}
public static boolean[] getBool(int a[]){
boolean result[] = new boolean[64];
for(int i = 0; i < a.length; i++ ){
if(a[i]==1){result[i]=true;}
else result[i]=false;
}
return result;
}
public static boolean[] getPermKeyPC1(boolean a[]){
int PC1[] = {57,49,41,33,25,17,9,
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4 };
boolean keyNew[] = new boolean[56];
for(int i = 0; i < 56; i++ ){
keyNew[i] = a[PC1[i]-1];
}
return keyNew;
}
public static boolean[] keyGenerator(boolean a[], int round){
boolean left[] = new boolean[28];
boolean right[] = new boolean[28];
boolean left_n[] = new boolean[28];
boolean right_n[] = new boolean[28];
for(int i = 0; i < 28; i++){
left[i] = a[i];
right[i] = a[i+28];
}
int j;
for(int i = 0; i < 28; i++ ){
j=i-round;
if(j<0){ j=28+i-round;}
left_n[j] = left[i];
right_n[j]= right[i];
}
for(int i = 0; i < 28; i++){
a[i]=left_n[i];
a[i+28] = right_n[i];
}
return a;
}
public static boolean[] getPermPC2(boolean a[]){
int PC2[]= {14,17,11,24,1,5,3,28,
15,6,21,10,23,19,12,4,
26,8,16,7,27,20,13,2,
41,52,31,37,47,55,30,40,
51,45,33,48,44,49,39,56,
34,53,46,42,50,36,29,32};
boolean n_key[] = new boolean[48];
for(int i = 0; i < 48; i++){
n_key[i] = a[PC2[i]-1];
}
return n_key;
}
public static boolean[] getInitialPerm(boolean a[]){
int initPerm[] = {58,50,42,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};
boolean pl_n[] = new boolean[64];
for(int i = 0; i < 64; i++){
pl_n[i] = a[initPerm[i]-1];
}
return pl_n;
}
public static boolean[] getLeft(boolean a[]){
boolean left[] = new boolean[32];
for(int i = 0; i < 32; i++){
left[i] = a[i];
}
return left;
}
public static boolean[] getRight(boolean a[]){
boolean right[] = new boolean[32];
for(int i = 0; i < 32; i++){
right[i] = a[i+32];
}
return right;
}
public static boolean[] expansionPerm(boolean a[]){
int exp[] = {32,1,2,3,4,5,
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1};
boolean pl_n[] = new boolean[48];
for(int i = 0; i < 48; i++){
pl_n[i] = a[exp[i]-1];
}
return pl_n;
}
public static boolean[] firstXOR(boolean pl[], boolean key[]){
boolean result[] = new boolean[48];
for(int i = 0; i < 48; i++){
result[i] = pl[i]^key[i];
}
return result;
}
public static int getInt(boolean[] b){
int x = 0;
for(boolean i : b) x = x << 1 | (i?1:0);
return x;
}
public static boolean[] intBit(int x){
boolean[] b = new boolean[4];
for(int i = 0; i < 4; i++) b[i] = (1 << 4-i-1 & x) != 0;
return b;
}
public static boolean[] SBox(boolean one[],boolean two[], boolean three[],
boolean four[],boolean five[],boolean six[],boolean seven[], boolean eight[]){
int s[][][] = {{{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}},
{{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}},
{{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}},
{{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}},
{{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}},
{{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}},
{{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}},
{{13
DES.rar_C DES_des_in
版权申诉
146 浏览量
2022-09-19
18:54:31
上传
评论
收藏 17KB RAR 举报
四散
- 粉丝: 54
- 资源: 1万+
最新资源
- vmware workstation pro 17 linux版
- 3479521_1710042575-1.rwmod
- 安装及环境配置UMCM-2023C-ma笔记
- (完整)数据库课程设计餐厅点餐说明书-21ab6d3c8beb172ded630b1c59eef8c75ebf952c.doc
- 2023-04-06-项目笔记 - 第一百五十四阶段 - 4.4.2.152全局变量的作用域-152 -2024.06.04
- 松哥解协议松哥解协议松哥解协议松哥解协议松哥解协议
- 618节日618节日618节日
- tensorflow-gpu-2.9.1-cp37-cp37m-win-amd64.whl
- tensorflow-gpu-2.9.0-cp37-cp37m-win-amd64.whl
- tensorflow-gpu-2.9.0-cp39-cp39-win-amd64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈