C语言实现数据加密算法
/*------------------------------------------------------Data Encryption Standard 56 位密钥加密 64 位数据 2011.10 --------------------------------------------------------*/ #include <stdlib.h> #include <stdio.h> #include "bool.h" // 位处理 #include "tables.h" void BitsCopy(bool *DatOut,bool *DatIn,int Len); // 数组复制
// 请输入密钥以解密 // 得到密钥 // 设置密钥 // 解密输出到 MyMessage // 解密结束
} /*------------------------------把 DatIn 开始的长度位 Len 位的二进制 复制到 DatOut 后 --------------------------------*/ void BitsCopy(bool *DatOut,bool *DatIn,int Len) { int i=0; for(i=0;i<Len;i++) { DatOut[i]=DatIn[i]; } } /*------------------------------字节转换成位函数 每 8 次换一个字节 每次向右移一位 和 1 与取最后一位 共 64 位 --------------------------------*/ void ByteToBit(bool *DatOut,char *DatIn,int Num) { int i=0; for(i=0;i<Num;i++) { DatOut[i]=(DatIn[i/8]>>(i%8))&0x01; } } /*------------------------------位转换成字节函数 字节数组每 8 次移一位 位每次向左移 与上一次或 ---------------------------------*/ void BitToByte(char *DatOut,bool *DatIn,int Num) { int i=0; for(i=0;i<(Num/8);i++) { DatOut[i]=0; } for(i=0;i<Num;i++) { DatOut[i/8]|=DatIn[i]<<(i%8);
// 数组复制 OK
// OK
// OK
} }
/*---------------------------------二进制密文转换为十六进制 需要 16 个字符表示 -----------------------------------*/ void BitToHex(char *DatOut,bool *DatIn,int Num) { int i=0; for(i=0;i<Num/4;i++) { DatOut[i]=0; } for(i=0;i<Num/4;i++) { DatOut[i] = DatIn[i*4]+(DatIn[i*4+1]<<1) +(DatIn[i*4+2]<<2)+(DatIn[i*4+3]<<3); if((DatOut[i]%16)>9) { DatOut[i]=DatOut[i]%16+'7'; // 余数大于 9 时处理 10-15 to A-F } // 输出字符 else { DatOut[i]=DatOut[i]%16+'0'; // 输出字符 } } } /*--------------------------------------------十六进制字符转二进制 ----------------------------------------------*/ void HexToBit(bool *DatOut,char *DatIn,int Num) { int i=0; // 字符型输入 for(i=0;i<Num;i++) { if((DatIn[i/4])>'9') // 大于 9 { DatOut[i]=((DatIn[i/4]-'7')>>(i%4))&0x01; } else
X=(DatIn[1]<<3)+(DatIn[2]<<2)+(DatIn[3]<<1)+DatIn[4]; // bcde 代表第几列 ByteToBit(DatOut,&S_Box[i][Y][X],4); // 把找到的点数据换为二进制 } } // F 函数 void F_Change(bool DatIn[32],bool DatKi[48]) // F 函数 { static bool MiR[48]={0}; // 输入 32 位通过 E 选位变为 48 位 TablePermute(MiR,DatIn,E_Table,48); Xor(MiR,DatKi,48); // 和子密钥异或 S_Change(DatIn,MiR); // S 盒变换 TablePermute(DatIn,DatIn,P_Table,32); // P 置换 Message is Encrypted!:\n"); for(i=0;i<16;i++) { printf("%c ",MesHex[i]); } printf("\n"); printf("\n");
printf("Please input your Secret Key to Deciphering:\n"); gets(YourKey); SetKey(YourKey); KickDes(MyMessage,MesHex); printf("Deciphering Over !!:\n"); for(i=0;i<8;i++) { printf("%c ",MyMessage[i]); } printf("\n"); system("pause"); /*------------------------------------------------*/
// 异或函数
// 异或
// 输入 48 位 输出 32 位 与 Ri 异或 void S_Change(bool DatOut[32],bool DatIn[48]) // S 盒变换 { int i,X,Y; // i 为 8 个 S 盒 for(i=0,Y=0,X=0;i<8;i++,DatIn+=6,DatOut+=4) // 每执行一次,输入数据偏移 6 位 { // 每执行一次,输出数据偏移 4 位 Y=(DatIn[0]<<1)+DatIn[5]; // af 代表第几行
void ByteToBit(bool *DatOut,char *DatIn,int Num); // 字节到位 void BitToByte(char *DatOut,bool *DatIn,int Num); // 位到字节 void BitToHex(char *DatOut,bool *DatIn,int Num); void HexToBit(bool *DatOut,char *DatIn,int Num); // 二进制到十六进制 64 位 to 4*16 字符 // 十六进制到二进制
/*-----------------------------------------------*/ printf("Welcome! Please input your Message(64 bit):\n"); gets(MyMessage); // 明文 printf("Please input your Secret Key:\n"); gets(MyKey); // 密钥
void TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num); // 位表置换函数 void LoopMove(bool *DatIn,int Len,int Num); // 循环左移 Len 长度 Num 移动位数 void Xor(bool *DatA,bool *DatB,int Num); // 异或函数 void S_Change(bool DatOut[32],bool DatIn[48]); void F_Change(bool DatIn[32],bool DatKi[48]); void SetKey(char KeyIn[8]); void PlayDes(char MesOut[8],char MesIn[8]); void KickDes(char MesOut[8],char MesIn[8]); // S 盒变换 // F 函数 // 设置密钥 // 执行 DES 加密 // 执行 DES 解密
while(MyKey[i]!='\0') { i++; }
// 计算密钥长度
while(i!=8) // 不是 8 提示错误 { printf("Please input a correct Secret Key!\n"); gets(MyKey); i=0; while(MyKey[i]!='\0') // 再次检测 { i++; } } SetKey(MyKey); PlayDes(MesHex,MyMessage); // 设置密钥 得到子密钥 Ki // 执行 DES 加密 // 信息已加密