用c语言写des加密算法

Python010

用c语言写des加密算法,第1张

#include <stdio.h> #include <string.h> #include <windows.h> #include <conio.h> #include "Schedle.h" class CShift{ public: DWORDLONG mask[16] int step[16] CShift(){ for(int i=0i<16i++){ step[i]=2 mask[i]=0xc000000 } step[0]=step[1]=step[8]=step[15]=1 mask[0]=mask[1]=mask[8]=mask[15]=0x8000000 } } class CDES{ public: CDES(){ m_dwlKey=0 m_dwlData=0 ConvertTableToMask(dwlKey_PC_1,64) //PrintTable(dwlKey_PC_1,7,8) ConvertTableToMask(dwlKey_PC_2,56) ConvertTableToMask(dwlData_IP,64) ConvertTableToMask(dwlData_Expansion,32) ConvertTableToMask(dwlData_FP,64) ConvertTableToMask(dwlData_P,32) Generate_S() } void PrintBit(DWORDLONG) void EncryptKey(char *) unsigned char* EncryptData(unsigned char *) unsigned char* DescryptData(unsigned char*) private: void ConvertTableToMask(DWORDLONG *,int) void Generate_S(void) void PrintTable(DWORDLONG*,int,int) DWORDLONG ProcessByte(unsigned char*,BOOL) DWORDLONG PermuteTable(DWORDLONG,DWORDLONG*,int) void Generate_K(void) void EncryptKernel(void) DWORDLONG Generate_B(DWORDLONG,DWORDLONG*) /*For verify schedule permutation only*/ DWORDLONG UnPermuteTable(DWORDLONG,DWORDLONG*,int) /**************************************/ DWORDLONG dwlData_S[9][4][16] CShift m_shift DWORDLONG m_dwlKey DWORDLONG m_dwlData DWORDLONG m_dwl_K[17] } void CDES::EncryptKey(char *key){ printf("\nOriginal Key: %s",key) m_dwlKey=ProcessByte((unsigned char*)key,TRUE) // PrintBit(m_dwlKey) m_dwlKey=PermuteTable(m_dwlKey,dwlKey_PC_1,56) // PrintBit(m_dwlKey) Generate_K() // printf("\n******************************************\n") } void CDES::Generate_K(void){ DWORDLONG C[17],D[17],tmp C[0]=m_dwlKey>>28 D[0]=m_dwlKey&0xfffffff for(int i=1i<=16i++){ tmp=(C[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]) C[i]=((C[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff tmp=(D[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]) D[i]=((D[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff m_dwl_K[i]=(C[i]<<28)|D[i] m_dwl_K[i]=PermuteTable(m_dwl_K[i],dwlKey_PC_2,48) } } DWORDLONG CDES::ProcessByte(unsigned char *key,BOOL shift){ unsigned char tmp DWORDLONG byte=0 int i=0 while(i<8){ while(*key){ if(byte!=0) byte<<=8 tmp=*key if(shift) tmp<<=1 byte|=tmp i++ key++ } if(i<8) byte<<=8 i++ } return byte } DWORDLONG CDES::PermuteTable(DWORDLONG dwlPara,DWOR 基于des算法的rfid安全系统

DLONG* dwlTable,int nDestLen){ int i=0 DWORDLONG tmp=0,moveBit while(i<nDestLen){ moveBit=1 if(dwlTable[i]&dwlPara){ moveBit<<=nDestLen-i-1 tmp|=moveBit } i++ } return tmp } DWORDLONG CDES::UnPermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen){ DWORDLONG tmp=0 int i=nDestLen-1 while(dwlPara!=0){ if(dwlPara&0x01) tmp|=dwlTable[i] dwlPara>>=1 i-- } return tmp } void CDES::PrintTable(DWORDLONG *dwlPara,int col,int row){ int i,j for(i=0i<rowi++){ printf("\n") getch() for(j=0j<colj++) PrintBit(dwlPara[i*col+j]) } } void CDES::PrintBit(DWORDLONG bitstream){ char out[76] int i=0,j=0,space=0 while(bitstream!=0){ if(bitstream&0x01) out[i++]='1' else out[i++]='0' j++ if(j%8==0){ out[i++]=' ' space++ } bitstream=bitstream>>1 } out[i]='\0' strcpy(out,strrev(out)) printf("%s **:%d\n",out,i-space) } void CDES::ConvertTableToMask(DWORDLONG *mask,int max){ int i=0 DWORDLONG nBit=1 while(mask[i]!=0){ nBit=1 nBit<<=max-mask[i] mask[i++]=nBit } } void CDES::Generate_S(void){ int i int j,m,n m=n=0 j=1 for(i=0i<512i++){ dwlData_S[j][m][n]=OS[i] n=(n+1)%16 if(!n){ m=(m+1)%4 if(!m) j++ } } } unsigned char * CDES::EncryptData(unsigned char *block){ unsigned char *EncrytedData=new unsigned char(15) printf("\nOriginal Data: %s\n",block) m_dwlData=ProcessByte(block,0) // PrintBit(m_dwlData) m_dwlData=PermuteTable(m_dwlData,dwlData_IP,64) EncryptKernel() // PrintBit(m_dwlData) DWORDLONG bit6=m_dwlData for(int i=0i<11i++){ EncrytedData[7-i]=(unsigned char)(bit6&0x3f)+46 bit6>>=6 } EncrytedData[11]='\0' printf("\nAfter Encrypted: %s",EncrytedData) for(i=0i<8i++){ EncrytedData[7-i]=(unsigned char)(m_dwlData&0xff) m_dwlData>>=8 } EncrytedData[8]='\0' return EncrytedData } void CDES::EncryptKernel(void){ int i=1 DWORDLONG L[17],R[17],B[9],EK,PSB L[0]=m_dwlData>>32 R[0]=m_dwlData&0xffffffff for(i=1i<=16i++){ L[i]=R[i-1] R[i-1]=PermuteTable(R[i-1],dwlData_Expansion,48)//Expansion R EK=R[i-1]^m_dwl_K[i]//E Permutation PSB=Generate_B(EK,B)//P Permutation R[i]=L[i-1]^PSB } R[16]<<=32 m_dwlData=R[16]|L[16] m_dwlData=PermuteTable(m_dwlData,dwlData_FP,64) } unsigned char* CDES::DescryptData(unsigned char *desData){ int i=1 unsigned char *DescryptedData=new unsigned char(15) DWORDLONG L[17],R[17],B[9],EK,PSB DWORDLONG dataPara dataPara=ProcessByte(desData,0) dataPara=PermuteTable(dataPara,dwlData_IP,64) R[16]=dataPara>>32 L[16]=dataPara&0xffffffff for(i=16i>=1i--){ R[i-1]=L[i] L[i]=PermuteTable(L[i],dwlData_Expansion,48)//Expansion L EK=L[i]^m_dwl_K[i]//E Permutation PSB=Generate_B(EK,B)//P Permutation L[i-1]=R[i]^PSB } L[0]<<=32 dataPara=L[0]|R[0] dataPara=PermuteTable(dataPara,dwlData_FP,64) // PrintBit(dataPara) for(i=0i<8i++){ DescryptedData[7-i]=(unsigned char)(dataPara&0xff) dataPara>>=8 } DescryptedData[8]='\0' printf("\nAfter Decrypted: %s\n",DescryptedData) return DescryptedData } DWORDLONG CDES::Generate_B(DWORDLONG EKPara,DWORDLONG *block){ int i,m,n DWORDLONG tmp=0 for(i=8i>0i--){ block[i]=EKPara&0x3f m=(int)(block[i]&0x20)>>4 m|=block[i]&0x01 n=(int)(block[i]<<1)>>2 block[i]=dwlData_S[i][m][n] EKPara>>=6 } for(i=1i<=8i++){ tmp|=block[i] tmp<<=4 } tmp>>=4 tmp=PermuteTable(tmp,dwlData_P,32) return tmp } void main(void){ CDES des des.EncryptKey("12345678") unsigned char *result=des.EncryptData((unsigned char*)"DemoData") des.DescryptData(result) }[1]

/*********************************************************************/

/*-文件名:des.h */

/*- */

/*-功能: 实现DES加密算法的加密解密功能*/

/*********************************************************************/

typedef int INT32

typedef char INT8

typedef unsigned char ULONG8

typedef unsigned short ULONG16

typedef unsigned long ULONG32

/*如果采用c++编译器的话采用如下宏定义

#define DllExport extern "C" __declspec(dllexport)

*/

#define DllExport __declspec(dllexport)

/*加密接口函数*/

DllExport INT32 DdesN(ULONG8 *data, ULONG8 **key, ULONG32 n_key,ULONG32 readlen)

DllExport INT32 desN(ULONG8 *data, ULONG8 **key, ULONG32 n_key,ULONG32 readlen)

DllExport INT32 des3(ULONG8 *data, ULONG8 *key,ULONG32 n ,ULONG32 readlen)

DllExport INT32 Ddes3(ULONG8 *data,ULONG8 *key,ULONG32 n ,ULONG32 readlen)

DllExport INT32 des(ULONG8 *data, ULONG8 *key,INT32 readlen)

DllExport INT32 Ddes(ULONG8 *data,ULONG8 *key,INT32 readlen)

*********************************************************************/

/*-文件名:des.c */

/*- */

/*-功能: 实现DES加密算法的加密解密功能*/

//*********************************************************************/

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <memory.h>

#include <malloc.h>

#include "des.h"

#define SUCCESS 0

#define FAIL -1

#define READFILESIZE 512

#define WZ_COMMEND_NUM 4

#define WZUSEHELPNUM 19

#define DESONE 1

#define DESTHREE 2

#define DESMULTI 3

INT8 *WZ_Commend_Help[] =

{

"基于DES的加密解密工具v1.0 ",/*0*/

"追求卓越,勇于创新 ",

"----著者 : 吴真--- ",

" "

}

INT8 *WZ_USE_HELP[]={

"输入5+n个参数:",

"\t1.可执行文件名 *.exe",

"\t2.操作类型 1:一层加密2:一层解密",

"\t\t13:N层单密钥加密23:N层单密钥解密",

"\t\t39:N层多密钥加密49:N层多密钥解密",

"\t3.读出数据的文件名*.txt",

"\t4.写入数据的文件名*.txt",

"\t5.密钥(8字节例如:wuzhen12)",

"\t[6].N层单密钥的层数或者...二层加密|解密密钥",

"\t[7].三层加密|解密密钥",

"\t[8]. ...",

"\t[N].N层加密|解密密钥",

"\t 例1: des 1 1.txt 2.txt 12345678",

"\t: des 2 2.txt 3.txt 12345678",

"\t 例2: des 13 1.txt 2.txt tiantian 5",

"\t: des 23 2.txt 3.txt tiantian 5",

"\t 例3: des 39 1.txt 2.txt 12345678 tiantian gaoxinma",

"\t: des 49 2.txt 3.txt 12345678 tiantian gaoxinma",

"******************************"

}

INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length)/*以16进制写入文件*/

INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len)/*16进制解码*/

INT32 file_enc(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag)

INT32 file_dec(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag)

void wz_print_help()

INT32 main(INT32 argc,INT8 *argv[])

{

INT8 *FILENAME1,*FILENAME2

FILE *fp, *fp2

ULONG8 *key

ULONG8 **superkey /*n层加密解密密钥*/

ULONG8 n_superkey

ULONG32 num

if ( argc >= 5 &&(atoi(argv[1]) == 39 || atoi(argv[1]) == 49 ) )

{

n_superkey = argc - 4

superkey = ( INT8 **)calloc(1, n_superkey*sizeof( void *) )

for ( num = 0 num <n_superkey num++)

{

superkey[num] = argv[4+num]

}

}

else if ( argc == 6 &&(atoi(argv[1]) == 13 || atoi(argv[1]) == 23 ) &&(atoi(argv[5])) >0)

{

}

else if ( argc == 5 &&( atoi(argv[1]) == 1 || atoi(argv[1]) == 2 ))

{

}

else

{

wz_print_help()

return FAIL

}

FILENAME1 = argv[2]

FILENAME2 = argv[3]

if ((fp= fopen(FILENAME1,"rb")) == NULL || (fp2 = fopen(FILENAME2,"wb"))==NULL)

{

printf("Can't open file\n")

return FAIL

}

key = argv[4]

switch( atoi(argv[1] ))

{

case 1: /*加密*/

file_enc(fp,fp2,key,0, NULL,0, DESONE)

printf("\n \tDES 一层加密完毕,密文存于%s文件\n",FILENAME2)

break

case 2:

file_dec(fp,fp2,key,0, NULL, 0,DESONE)

printf("\n \tDES 一层解密完毕,密文存于%s文件\n",FILENAME2)

break

case 13:

file_enc(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE)

printf("\n \tDES %u层单密钥加密完毕,密文存于%s文件\n",atoi(argv[5]),FILENAME2)

break

case 23:

file_dec(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE)

printf("\n \tDES %u层单密钥解密完毕,密文存于%s文件\n",atoi(argv[5]),FILENAME2)

break

case 39:

file_enc(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI)

printf("\n \tDES 多密钥加密完毕,密文存于%s文件\n",FILENAME2)

free(superkey)

superkey = NULL

break

case 49:

file_dec(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI)

printf("\n \tDES 多密钥加密完毕,密文存于%s文件\n",FILENAME2)

free(superkey)

superkey = NULL

break

default:

printf("请选择是加密|解密 plese choose encrypt|deencrypt\n")

break

}

fclose(fp)

fclose(fp2)

return SUCCESS

}

void wz_print_help()

{

INT32 i

printf("\t")

for ( i = 0 i <22 i++)

{

printf("%c ",5)

}

printf("\n")

for( i = 0 i <WZ_COMMEND_NUM i++)

{

printf("\t%c\t%s %c\n",5,WZ_Commend_Help[i],5)

}

printf("\t")

for ( i = 0 i <22 i++)

{

printf("%c ",5)

}

printf("\n")

for( i = 0 i <WZUSEHELPNUM i++)

{

printf("\t%s\n",WZ_USE_HELP[i])

}

return

}

INT32 file_enc(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag)

{

INT32 filelen = 0,readlen = 0,writelen = 0

ULONG32 totalfilelen = 0 /*统计实际的文件的长度*/

ULONG8 readbuf[READFILESIZE] = { 0 }

filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile )

while( filelen == READFILESIZE )

{

totalfilelen += READFILESIZE

switch(flag)

{

case DESONE:

des( readbuf,key,READFILESIZE)

break

case DESTHREE:

des3( readbuf, key ,keynum,READFILESIZE)

break

case DESMULTI:

desN( readbuf, superkey ,n_superkey,READFILESIZE)

break

}

hextofile( readbuf, writefile, READFILESIZE )/*以16进制形式写入文件*/

memset(readbuf,0,READFILESIZE)

filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile )

}

/*这是从文件中读出的最后一批数据,长度可能会等于0,所以要先判断*/

if ( filelen >0 )

{

/*如果从文件中读出的长度不等于0,那么肯定有8个字节以上的空间

文件长度存在最后8个字节中*/

totalfilelen += filelen

memcpy( &readbuf[READFILESIZE-8], (ULONG8*)&totalfilelen,4)

switch(flag)

{

case DESONE:

des( readbuf,key,READFILESIZE)

break

case DESTHREE:

des3( readbuf, key ,keynum,READFILESIZE)

break

case DESMULTI:

desN( readbuf, superkey ,n_superkey,READFILESIZE)

break

}

hextofile( readbuf, writefile,READFILESIZE )/*以16进制形式写入文件*/

memset(readbuf,0 ,READFILESIZE)

}

else /*filelen == 0*/

{

memcpy( &readbuf[0], (ULONG8*)&totalfilelen,4)

switch(flag)

{

case DESONE:

des( readbuf,key,8)

break

case DESTHREE:

des3( readbuf, key ,keynum,8)

break

case DESMULTI:

desN( readbuf, superkey ,n_superkey,8)

break

}

hextofile( readbuf, writefile, 8)/*以16进制形式写入文件*/

}

return SUCCESS

}

INT32 file_dec(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag)

{

INT32 filelen = 0,readlen = 0,writelen = 0

ULONG32 totalfilelen = 0 /*统计实际的文件的长度*/

INT32 num = 0

ULONG8 readbuf[READFILESIZE] = { 0 }

ULONG8 sendbuf[READFILESIZE*2] = { 0 }

fseek(readfile,-16,SEEK_END)/*最后16个字节的表示文件长度的空间*/

filelen = fread( sendbuf, sizeof( INT8 ), 16, readfile )

encodehex( readbuf,sendbuf,8)

switch(flag)

{

case DESONE:

Ddes( readbuf,key,8)

break

case DESTHREE:

Ddes3( readbuf, key ,keynum,8)

break

case DESMULTI:

DdesN( readbuf, superkey ,n_superkey,8)

break

}

/*解密*/

memcpy((ULONG8*)&totalfilelen, &readbuf[0],4)/*得到文件总长*/

memset(readbuf,0 ,8)

memset(sendbuf,0 ,16)

num = totalfilelen/READFILESIZE/*有几个READFILESIZE组*/

totalfilelen %= READFILESIZE

fseek(readfile,0,SEEK_SET)/*跳到文件头*/

while(num--)

{

filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile )

encodehex( readbuf,sendbuf,READFILESIZE)

switch(flag)

{

case DESONE:

Ddes( readbuf,key,READFILESIZE)

break

case DESTHREE:

Ddes3( readbuf, key ,keynum,READFILESIZE)

break

case DESMULTI:

DdesN( readbuf, superkey ,n_superkey,READFILESIZE)

break

}

writelen = fwrite(readbuf, sizeof( INT8 ), READFILESIZE, writefile)

memset(readbuf,0 ,READFILESIZE)

memset(sendbuf,0 ,READFILESIZE*2)

}

if ( totalfilelen >0 )/*最后一块有多余的元素*/

{

filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile )

encodehex( readbuf,sendbuf,READFILESIZE)

switch(flag)

{

case DESONE:

Ddes( readbuf,key,READFILESIZE)

break

case DESTHREE:

Ddes3( readbuf, key ,keynum,READFILESIZE)

break

case DESMULTI:

DdesN( readbuf, superkey ,n_superkey,READFILESIZE)

break

}

writelen = fwrite(readbuf, sizeof( INT8 ), totalfilelen, writefile)

memset(readbuf,0 ,READFILESIZE)

memset(sendbuf,0 ,READFILESIZE*2)

}

return SUCCESS

}

INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length)

{

ULONG32 writelen = 0

/*以16进制形式写入文件*/

while( writelen <length)

{

if(buf[writelen] == 0)

{

fprintf( writefile, "%x", 0 )

fprintf( writefile, "%x", 0 )

}

else if (buf[writelen] <0x10)

{

fprintf( writefile, "%x", 0 )

fprintf( writefile, "%x", buf[writelen] )

}

else

{

fprintf( writefile, "%x", buf[writelen] )

}

writelen++

}

return SUCCESS

}

INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len)

{

ULONG8 *readfirst = frombuf

ULONG8 *readend = &frombuf[1]

INT8 *s

ULONG8 y[2]

ULONG32 i

for ( i = 0 i <len i++)

{

y[0] = *readfirst

y[1] = *readend

readfirst += 2

readend += 2

tobuf[i] = (ULONG8)strtol((INT8*)y, &s, 16)

}

return SUCCESS

}

首先新建头文件des_encode.H

内容如下:

void EncodeMain() //EncodeMain function

void DecodeMain()//Sorry ,it has not used

void Decode(int *str,int *keychar) //decode :input 8 chars,8 keychars

void Encode(int *str,int *keychar) //encode: input 8 chars,8 keychars

void keyBuild(int *keychar)//create key array

void StrtoBin(int *midkey,int *keychar) //change into binary

void keyCreate(int *midkey2,int movebit,int i)//call by keyBuild

void EncodeData(int *lData,int *rData,int *srt) //encodedata function

void F(int *rData,int *key) //F function

void Expand(int *rData,int *rDataP) //Expand function

void ExchangeS(int *rDataP,int *rData) //S-diagram change

void ExchangeP(int *rData) //P change

void FillBin(int *rData,int n,int s)// data to binarycall by S-Diagram change function

void DecodeData(int *str,int *lData,int *rData) //DecodeData from binary

int IP1[]={58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,//initial change

62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,

57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,

61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7,

}

int IP2[]={40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,//opp initial change

38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,

36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,

34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25

}

int s[][4][16]={{ //S-diagram array

{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},

{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},

{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},

{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}

},

{

{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},

{3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},

{0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},

{13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}

},

{

{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},

{13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},

{13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},

{1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}

},

{

{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},

{13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},

{10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},

{3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}

},

{

{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},

{14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},

{4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},

{11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}

},

{

{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},

{10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},

{9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},

{4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}

},

{

{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},

{13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},

{1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},

{6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}

},

{

{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},

{1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},

{7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},

{2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}

}

}

int Ex[48]={ 32,1,2,3,4,5, //Expand array

4,5,6,7,8,9,

8,9,10,11,12,13,

12,13,14,15,16,17,

16,17,18,19,20,21,

20,21,22,23,24,25,

24,25,26,27,28,29,

28,29,30,31,32,1

}

int P[32]={16,7,20,21,//P-change

29,12,28,17,

1,15,23,26,

5,18,31,10,

2,8,24,14,

32,27,3,9,

19,13,30,6,

22,11,4,25

}

int PC1[56]={57,49,41,33,25,17,9,//PC-1 in keyBuild

1,58,50,42,34,26,18,

10,2,59,51,43,35,27,

19,11,3,60,52,44,36,

63,55,47,39,31,33,15,

7,62,54,46,38,30,22,

14,6,61,53,45,37,29,

21,13,5,28,20,12,4

}

int PC2[48]={14,17,11,24,1,5, //PC-2 in keyBuild

3,28,15,6,21,10,

23,19,12,4,26,8,

16,7,27,20,13,2,

41,52,31,37,47,55,

30,40,51,45,33,48,

44,49,39,56,34,53,

46,42,50,36,29,32

}

再创建des.cpp

内容如下:

#include<stdio.h>

#include<string.h>

#include"des_encode.h"

int key[16][48]

char str[8]

void main() //main function

{

EncodeMain()

}

void EncodeMain() //EncodeMain function

{

int i

char keychar[8]

int key2[8]

int strkey[8]

printf("请输入8个要加密的字符:\n")

for(i=0i<8i++)

scanf("%c",&str[i])

getchar()

for(i=0i<8i++)

strkey[i]=str[i]

printf("\n输入明文的十六进制为:\n")

for(i=0i<8i++)

printf("%10x",strkey[i])

printf("\n请输入密钥(8个字符):\n")

for(i=0i<8i++)

scanf("%c",&keychar[i])

for(i=0i<8i++)

key2[i]=keychar[i]

getchar()

// printf("%c",keychar[i])

Encode(strkey,key2)

printf("\n加密后十六进制密文是:\n")

for(i=0i<8i++)

printf("%10x",strkey[i])

printf("\n\n清输入解密密码\n")

for(i=0i<8i++)

scanf("%c",&keychar[i])

for(i=0i<8i++)

key2[i]=keychar[i]

Decode(strkey,key2)

for(i=0i<8i++)

printf("%10x",strkey[i])

for(i=0i<8i++)

str[i]=strkey[i]

printf("\n明文为:\t")

for(i=0i<8i++)

printf("%c",str[i])

printf("\n\n")

}

void keyBuild(int *keychar){//create key array

int i,j

int movebit[]={1,1,2,2,2,2,2,2,

1,2,2,2,2,2,2,1}

int midkey2[56]

int midkey[64]

StrtoBin(midkey,keychar)

for(i=0i<56i++)

midkey2[i]=midkey[PC1[i]-1]

for(i=0i<16i++)

keyCreate(midkey2,movebit[i],i)

}

void StrtoBin(int *midkey,int *keychar){ //change into binary

int trans[8],i,j,k,n

n=0

for(i=0i<8i++){

j=0

while(keychar[i]!=0){

trans[j]=keychar[i]%2

keychar[i]=keychar[i]/2

j++

}

for(k=jk<8k++)trans[k]=0

for(k=0k<8k++)

midkey[n++]=trans[7-k]

}

}

void keyCreate(int *midkey2,int movebit,int n){

int i,temp[4]

temp[0]=midkey2[0]

temp[1]=midkey2[1]

temp[2]=midkey2[28]

temp[3]=midkey2[29]

if(movebit==2){

for(i=0i<26i++){

midkey2[i]=midkey2[i+2]

midkey2[i+28]=midkey2[i+30]

}

midkey2[26]=temp[0]midkey2[27]=temp[1]

midkey2[54]=temp[2]midkey2[55]=temp[3] }

else

{ for(i=0i<27i++){

midkey2[i]=midkey2[i+1]

midkey2[i+28]=midkey2[i+29]

}

midkey2[27]=temp[0]midkey2[55]=temp[2]

}

for(i=0i<48i++)

key[n][i]=midkey2[PC2[i]-1]

}

void EncodeData(int *lData,int *rData,int *str){ //encodedata function

int i,j,temp[8],lint,rint//int h

int data[64]

lint=0,rint=0

for(i=0i<4i++){

j=0

while(str[i]!=0){

temp[j]=str[i]%2

str[i]=str[i]/2

j++

}

while(j<8)temp[j++]=0

for(j=0j<8j++)

lData[lint++]=temp[7-j]

j=0

while(str[i+4]!=0){

temp[j]=str[i+4]%2

str[i+4]=str[i+4]/2

j++

}

while(j<8)temp[j++]=0

for(j=0j<8j++)rData[rint++]=temp[7-j]

}

for(i=0i<32i++){

data[i]=lData[i]

data[i+32]=rData[i]

}

for(i=0i<32i++){

lData[i]=data[IP1[i]-1]//printf("P1:%5d:%5d,%5d\n",IP1[i],lData[i],data[IP1[i]-1])

rData[i]=data[IP1[i+32]-1]

}

}

void F(int *rData,int *key){ //F function

int i,rDataP[48]

Expand(rData,rDataP)

for(i=0i<48i++){

rDataP[i]=rDataP[i]^key[i]// printf("%10d",rDataP[i])if((i+1)%6==0)printf("\n")

}

ExchangeS(rDataP,rData)

ExchangeP(rData)

}

void Expand(int *rData,int *rDataP){ //Expand function

int i

for(i=0i<48i++)

rDataP[i]=rData[Ex[i]-1]

}

void ExchangeS(int *rDataP,int *rData){ //S-diagram change

int i,n,linex,liney

linex=liney=0

for(i=0i<48i+=6){

n=i/6//printf("%10d\n",(rDataP[i]<<1))

linex=(rDataP[i]<<1)+rDataP[i+5]

liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4]

FillBin(rData,n,s[n][linex][liney])

}

}

void ExchangeP(int *rData){ //P change

int i,temp[32]

for(i=0i<32i++)

temp[i]=rData[i]

for(i=0i<32i++)

rData[i]=temp[P[i]-1]

}

void FillBin(int *rData,int n,int s){ // data to binarycall by S-Diagram change function

int temp[4],i

for(i=0i<4i++){

temp[i]=s%2

s=s/2

}

for(i=0i<4i++)

rData[n*4+i]=temp[3-i]

}

void DecodeData(int *str,int *lData,int *rData){//DecodeData from binary

int iint a,bint data[64]

a=0,b=0

for(i=0i<32i++){

data[i]=lData[i]

data[i+32]=rData[i]

}

for(i=0i<32i++){

lData[i]=data[IP2[i]-1]

rData[i]=data[IP2[i+32]-1]

}

for(i=0i<32i++){

a=(lData[i]&0x1)+(a<<1)

b=(rData[i]&0x1)+(b<<1)

if((i+1)%8==0){

str[i/8]=aa=0//printf("%d",i/8)

str[i/8+4]=bb=0//printf("%d",i/8+4)

}

}

}

void Encode(int *str,int *keychar){ //encode: input 8 chars,8 keychars

int lData[32],rData[32],temp[32],rDataP[48]

int i,j

keyBuild(keychar)

EncodeData(lData,rData,str)

for(i=0i<16i++){

for(j=0j<32j++)

temp[j]=rData[j]

F(rData,key[i])

for(j=0j<32j++){

rData[j]=rData[j]^lData[j]

}

for(j=0j<32j++)

lData[j]=temp[j]

}

DecodeData(str,rData,lData)

}

void Decode(int *str,int *keychar){ //decode :input 8 chars,8 keychars

int lData[32],rData[32],temp[32],rDataP[48]

int i,j

keyBuild(keychar)

EncodeData(lData,rData,str)//这个位置

for(i=0i<16i++){

for(j=0j<32j++)

temp[j]=rData[j]

F(rData,key[15-i])

for(j=0j<32j++){

rData[j]=rData[j]^lData[j]

}

for(j=0j<32j++){

lData[j]=temp[j]

}

}

DecodeData(str,rData,lData)

}

OK了

如果还有问题

给我发站内信