利用C语言简单实现单重DES

0x00 简介 此程序通过单重des实现8个字节的加密和解密。 新建一个工程,这个工程需要3个cpp文件(c文件也可以)和2个头文件。 cpp文件:main.cpp、des.cpp、status.cpp 头文件:des.h、status.h 0x01 代码 以下为主函数main.cpp的内容: #include <stdio.h> #include "status.h" #include "des.h" int main() { char M[8],Key[9]; printf("Input Plaintext :"); scanf("%s",&M); printf("Input Key :"); scanf("%s",&Key); SetKey(Key);//生成16个子秘钥 printf("加密:"); Des(M,'e'); printf("%s\n",M); printf("解密:"); Des(M,'d'); printf("%s\n",M); return 0; } 以下为des.cpp的内容: #include <stdio.h> #include <string.h> #include "status.h" #include "des.h" void ByteToBit(const char *In,bool *Out,int bits) { for (int j=0;j<bits;j++) Out[j]=(In[j/8]>>(j%8))& 1; } void BitToByte(bool *In,char *Out,int bits) { memset(Out,0,(bits+7)/8); for (int k=0;k<bits;k++) Out[k/8]|=In[k]<<(k%8); } void Transform(bool *Y,bool *X,const char *Table,int len) { for (int l=0;l<len;l++) Temp[l]=X[Table[l]-1]; memcpy(Y,Temp,len); } void Des(char *m,char ch) { bool Tem[32]; ByteToBit(m,P,64); Transform(P,P,IP1_Table,64); Li=&P[0]; Ri=&P[32]; if (ch=='e') { for (i=0;i<16;i++) { memcpy(Tem,Ri,32);//临时存放明文的右半部分 f(Ri,SubKey[i]); XOR(Ri,Li,32); memcpy(Li,Tem,32);//将明文的右半部分写入Li } } else { for (i=15;i>=0;i--) { memcpy(Tem,Li,32);//临时存放明文的右半部分 f(Li,SubKey[i]); XOR(Li,Ri,32); memcpy(Ri,Tem,32);//将明文的右半部分写入Li } } Transform(P,P,IP2_Table,64); BitToByte(P,m,64); } void f(bool *R,bool *k) { bool T[48]; Transform(T,R,E_Table,48);//32位的Ri扩展为48位 XOR(T,k,48);//Ri和轮秘钥的异或 S_Box_f(T,R); Transform(R,R,P_Table,32); } void XOR(bool *R,bool *k,int len) { for (int m=0;m<len;m++) R[m]=R[m]^k[m]; } void S_Box_f(bool *B,bool *C) { int a,b; for (int k=0;k<8;k++) { a=B[0]*2+B[5]; b=B[1]*8+B[2]*4+B[3]*2+B[4]; ByteToBit(&S_Box[k][a][b],C,4); B+=6; C+=4; } } //以下求得子秘钥 void SetKey(char *KEY) { ByteToBit(KEY,K,64); Transform(K,K,PC1_Table,56); printf("\n\n\n"); Ci=&K[0]; Di=&K[28]; for (int j=0;j<16;j++) { MovKey(Ci,28,LOOP_Table[j]); MovKey(Di,28,LOOP_Table[j]); Transform(SubKey[j],K,PC2_Table,48); } } void MovKey(bool *LR,int len,int loop) { memcpy(Temp,LR,loop); memcpy(LR,LR+loop,len-loop); memcpy(LR+len-loop,Temp,loop); } 以下为status.



可以返回顶部