DES加解密算法及代码(c语言版)——复制粘贴可直接跑

先来简单看一下实现流程

流程图

在这里插入图片描述

代码(保姆级注释!!!)

#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 
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值