先来简单看一下实现流程
流程图
代码(保姆级注释!!!)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"table.h"//存储各种数据表的头文件
// 十六轮子密钥
static bool SubKey[16][48] = {
0 };
/*-----------------------------自定义函数-----------------------------*/
void SetKey(char My_key[8]); //生成16轮的子密钥
void ByteToBit(bool * Data_out, char * Data_in, int Num); //字节转换成位
void BitToByte(char My_message[8], bool * Message_in, int Num); //位转换成字节
void TableReplace(bool *Data_out, bool *Data_in, const char *Table, int Num); //各种表的置换算法
void Bitcopy(bool * Data_out, bool * Data_in, int Num); //二进制数组的拷贝
void Loop_bit(bool * Data_out, int movstep, int len); //左移
void Run_Des(char My_message[8], char CIPhertext[64]);//des的轮加密算法
void Xor(bool * Message_out, bool * Message_in, int Num); //执行异或
void S_change(bool * Data_out, bool * Data_in); // S盒变换
void Run_desDes(char My_message[8], char CIPhertext[64]);// DES轮解密算法
/*--------------------------*/
/*--------------------------主函数----------------------------------*/
int main()
1
{
int i = 0, j;
char My_key[8] = {
0 }; //记录加密密钥
char You_key[8] = {
0 }; //解密密钥
char My_message[8] = {
0 }; //明文
char CIPhertext[64] = {
0 };//密文
printf("请输入你要加密的内容(8 Byte):\n");
scanf("%s", My_message);
printf("请输入你的加密密钥(8 Byte):\n");
scanf("%s", My_key);
i = strlen(My_key);
while (i != 8)//确保密钥长度为8byte
{
printf("请输入加密密钥(8 Byte)\n");
scanf("%s", My_key);
i = 0;
i = strlen(My_key);
}
SetKey(My_key); //生成16轮的加密子密钥
Run_Des(My_message, CIPhertext); //des的轮加密过程
printf("经过加密的密文为(二进制):\n");
printf("%s", CIPhertext);
printf("\n");
Run_desDes(My_message, CIPhertext);//解密;
printf("解密结果为:\n");
printf("%s", My_message);
printf("\n");
return 0;
}
/*--------------------具体函数定义----------------------*/
void Bitcopy(bool * Data_out, bool * Data_in, int Num) //二进制数组拷贝
{
int i = 0;
for (i = 0; i < Num; i++)
Data_out[i] = Data_in[i];
}
void ByteToBit(bool * Data_out, char * Data_in, int Num) //字节转位,num为二进制位数
{
int i, j;
for (i = 0; i < Num; i++)
Data_out[i] = (Data_in[i / 8] >> (i % 8)) & 0x01;
}
void BitToByte(char My_message[8], bool * Message_in, int Num) //位转换成字节,num为位数
{
int i = 0;
for (i = 0; i < (Num / 8); i++)
My_message[i] = 0;
for (i = 0; i < Num; i++)
My_message[i / 8] |= Message_in[i] << (i % 8);
}
void TableReplace(bool *Data_out, bool * Data_in, const char *Table, int Num) // 置换算法,Num表示置换表的长度
{
int i = 0;
static bool Temp[256] = {
0 };
for (i = 0; i < Num; i++)
{
Temp[i] = Data_in[Table[i] - 1];//将输入数据的指定位置作为输出数据的第i位
}
Bitcopy(Data_out, Temp, Num);
}
void Loop_bit(bool * Data_out, int movstep, int len)//左循环移位
{
static bool Temp[256] = {
0 };
Bitcopy(Temp, Data_out, movstep);//将前movstep位数据放入temp缓存
Bitcopy(Data_out, Data_out