📄 des.cpp
字号:
/////////////////////
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "stdafx.h"
#include "DES.h"
//对64位明文的初始置换
void desIP1(char PlainText1[64], char PlainText2[64])
{
int i;
int pos;
for(i=0; i<64; i++)
{
pos = IP_1[i];
PlainText2[i] = PlainText1[pos];
}
PlainText2[64] = '\0';
}
//对64位密文的逆置换
void desIP2(char PlainText1[64], char PlainText2[64])
{
int i;
int pos;
for(i=0; i<64; i++)
{
pos = IP_2[i];
PlainText2[i] = PlainText1[pos];
}
PlainText2[64] = '\0';
}
//将64位明文分成两部分
void divide(char PlainText1[64], char PlainText2[32], char PlainText3[32])
{
int i;
for(i=0; i<32; i++)
{
PlainText2[i] = PlainText1[i];
PlainText3[i] = PlainText1[32+i];
}
// PlainText2[32] = '\0';
// PlainText3[32] = '\0';
}
//将运算后的两部分密文合成为64位密文
void compose(char Cipher1[64], char Cipher2[32], char Cipher3[32])
{
int i;
for(i=0; i<32; i++)
{
Cipher1[i] = Cipher2[i];
Cipher1[32+i] = Cipher3[i];
}
Cipher1[64] = '\0';
}
//产生密钥过程中的初始置换
void desPC1(char Key1[64], char Key2[56])
{
int i;
int pos;
for(i=0; i<56; i++)
{
pos = PC_1[i];
Key2[i] = Key1[pos];
}
Key2[56] = '\0';
}
//将56位密钥分成两部分
void C0D0(char Key1[56], char Key2[28], char Key3[28])
{
int i;
for(i=0; i<28; i++)
{
Key2[i] = Key1[i];
Key3[i] = Key1[28+i];
}
Key1[56] = '\0';
}
//左循环一位或两位运算
void LS(char Key1[28], int n, char Key2[28])
{
int i;
/*
if(n == 1)
{
char ch = Key1[0];
for(i=0; i<27; i++)
Key2[i] = Key1[i+1];
Key[27] = ch;
}
else if(n == 2)
{
char ch1 = Key1[0];
char ch2 = Key1[1];
for(i=0; i<26; i++)
{
Key2[i] = Key1[i+2];
}
Key2[26] = Key1[0];
Key2[27] = Key1[1];
}
*/
//下面的这种方法比较易读,但效率不高
for(i=0; i<28; i++)
Key2[i] = Key1[(i+n) % 28];
Key2[28] = '\0';
}
//密钥产生过程中的合成运算
void CD(char Key1[56], char Key2[28], char Key3[28])
{
int i;
for(i=0; i<28; i++)
{
Key1[i] = Key2[i];
Key1[28+i] = Key3[i];
}
Key1[56] = '\0';
}
//产生密钥过程中的第二次置换
void desPC2(char Key1[56], char Key2[48])
{
int i;
int pos;
for(i=0; i<48; i++)
{
pos = PC_2[i];
Key2[i] = Key1[pos];
}
Key2[48] = '\0';
}
//扩展运算,32->48
void desE(char PlainText1[32], char PlainText2[48])
{
int i;
int pos;
for(i=0; i<48; i++)
{
pos = E[i];
PlainText2[i] = PlainText1[pos];
}
PlainText2[48] = '\0';
}
//f函数中异或运算
void EJB(char EE[48], char JJ[48], char BB[48])
{
int i;
for(i=0; i<48; i++)
BB[i] = EE[i] ^ JJ[i];
BB[48] = '\0';
}
//f函数中的P置换
void desP(char C1[32], char C2[32])
{
int i;
int pos;
for(i=0; i<32; i++)
{
pos = P[i];
C2[i] = C1[pos];
}
C2[32] = '\0';
}
//f函数中的S盒变换
void desS(char BB[48], char CC[32])
{
int col, row;
int val;
//第一个S盒运算
row = BB[0]*2 + BB[5];
col = BB[1]*8 + BB[2]*4 + BB[3]*2 + BB[4];
//将int型val转换为二进制字符(4 bit)
val = SP_1[row][col];
if(val >= 8)
CC[0] = '1';
else
CC[0] = '0';
if((val-8) >= 4)
CC[1] = '1';
else
CC[1] = '0';
if((val-12) >= 2)
CC[2] = '1';
else
CC[2] = '0';
if((val-14) >= 1)
CC[3] = '1';
else
CC[3] = '0';
//第二个S盒运算
row = BB[6]*2 + BB[11];
col = BB[7]*8 + BB[8]*4 + BB[9]*2 + BB[10];
val = SP_2[row][col];
//将int型val转换为二进制字符(4 bit)
if(val >= 8)
CC[4] = '1';
else
CC[4] = '0';
if((val-8) >= 4)
CC[5] = '1';
else
CC[5] = '0';
if((val-12) >= 2)
CC[6] = '1';
else
CC[6] = '0';
if((val-14) >= 1)
CC[7] = '1';
else
CC[7] = '0';
//第三个S盒运算
row = BB[12]*2 + BB[17];
col = BB[13]*8 + BB[14]*4 + BB[15]*2 + BB[16];
//将int型val转换为二进制字符(4 bit)
val = SP_3[row][col];
if(val >= 8)
CC[8] = '1';
else
CC[8] = '0';
if((val-8) >= 4)
CC[9] = '1';
else
CC[9] = '0';
if((val-12) >= 2)
CC[10] = '1';
else
CC[10] = '0';
if((val-14) >= 1)
CC[11] = '1';
else
CC[11] = '0';
//第四个S盒运算
row = BB[18]*2 + BB[23];
col = BB[19]*8 + BB[20]*4 + BB[21]*2 + BB[22];
val = SP_4[row][col];
//将int型val转换为二进制字符(4 bit)
if(val >= 8)
CC[12] = '1';
else
CC[12] = '0';
if((val-8) >= 4)
CC[13] = '1';
else
CC[13] = '0';
if((val-12) >= 2)
CC[14] = '1';
else
CC[14] = '0';
if((val-14) >= 1)
CC[15] = '1';
else
CC[15] = '0';
//第五个S盒运算
row = BB[24]*2 + BB[29];
col = BB[25]*8 + BB[26]*4 + BB[27]*2 + BB[28];
val = SP_5[row][col];
//将int型val转换为二进制字符(4 bit)
if(val >= 8)
CC[16] = '1';
else
CC[16] = '0';
if((val-8) >= 4)
CC[17] = '1';
else
CC[17] = '0';
if((val-12) >= 2)
CC[18] = '1';
else
CC[18] = '0';
if((val-14) >= 1)
CC[19] = '1';
else
CC[19] = '0';
//第六个S盒运算
row = BB[30]*2 + BB[35];
col = BB[31]*8 + BB[32]*4 + BB[33]*2 + BB[34];
val = SP_6[row][col];
//将int型val转换为二进制字符(4 bit)
if(val >= 8)
CC[20] = '1';
else
CC[20] = '0';
if((val-8) >= 4)
CC[21] = '1';
else
CC[21] = '0';
if((val-12) >= 2)
CC[22] = '1';
else
CC[22] = '0';
if((val-14) >= 1)
CC[23] = '1';
else
CC[23] = '0';
//第七个S盒运算
row = BB[36]*2 + BB[41];
col = BB[37]*8 + BB[38]*4 + BB[39]*2 + BB[40];
val = SP_7[row][col];
//将int型val转换为二进制字符(4 bit)
if(val >= 8)
CC[24] = '1';
else
CC[24] = '0';
if((val-8) >= 4)
CC[25] = '1';
else
CC[25] = '0';
if((val-12) >= 2)
CC[26] = '1';
else
CC[26] = '0';
if((val-14) >= 1)
CC[27] = '1';
else
CC[27] = '0';
//第八个S盒运算
row = BB[42]*2 + BB[47];
col = BB[43]*8 + BB[44]*4 + BB[45]*2 + BB[46];
//将int型val转换为二进制字符(4 bit)
val = SP_8[row][col];
if(val >= 8)
CC[28] = '1';
else
CC[28] = '0';
if((val-8) >= 4)
CC[29] = '1';
else
CC[29] = '0';
if((val-12) >= 2)
CC[30] = '1';
else
CC[30] = '0';
if((val-14) >= 1)
CC[31] = '1';
else
CC[31] = '0';
CC[32] = '\0';
}
//产生明文右半部分时的异或运算
void createR(char LL[32], char ff[32], char RR[32])
{
int i;
for(i=0; i<32; i++)
RR[i] = LL[i] ^ ff[i];
RR[32] = '\0';
}
//生成子密钥的过程
void des_key(char Key1[64], char Key[48])
{
char Key2[56], Key3[28], Key4[28];
desPC1(Key1, Key2);
C0D0(Key2, Key3, Key4);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -