如何用C实现3DES算法..

Python024

如何用C实现3DES算法..,第1张

//功能:实现DES及3DES加解密的算法

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "des.h"

//函数声明

int Do_DES(char* strSrc, char* strKey, char* strDest, char flag)

int Do_3DES(char* strSrc, char* strKey, char* strDest, char flag)

//主函数

int main(int argc, char** argv)

{

char src16[16+1],key16[16+1],key48[48+1],dest16[16+1]

if(argc != 3)

{

fprintf(stderr,"Usage: [%s -e|-d s|3]\n",argv[0])

exit(1)

}

if(strcmp(argv[2],"-s") == 0)

{

if(strcmp(argv[1],"-e") == 0)

{

fprintf(stderr,"Please input the string that you want to encrypt(16 hex number):\n")

memset(src16,0,sizeof(src16))

scanf("%s",src16)

fprintf(stderr,"Please input the Key string(16 hex number):\n")

memset(key16,0,sizeof(key16))

scanf("%s",key16)

memset(dest16,0,sizeof(dest16))

Do_DES(src16,key16,dest16,'e')

fprintf(stderr,"Result: [%s]\n",dest16)

}

else if(strcmp(argv[1],"-d") == 0)

{

fprintf(stderr,"Please input the string that you want to decrypt(16 hex number):\n")

memset(src16,0,sizeof(src16))

scanf("%s",src16)

fprintf(stderr,"Please input the Key string(16 hex number):\n")

memset(key16,0,sizeof(key16))

scanf("%s",key16)

memset(dest16,0,sizeof(dest16))

Do_DES(src16,key16,dest16,'d')

fprintf(stderr,"Result: [%s]\n",dest16)

}

else

return -1

}

else if(strcmp(argv[2],"-3") == 0)

{

if(strcmp(argv[1],"-e") == 0)

{

fprintf(stderr,"Please input the string that you want to encrypt(16 hex number):\n")

memset(src16,0,sizeof(src16))

scanf("%s",src16)

fprintf(stderr,"Please input the Key string(16 hex number):\n")

memset(key48,0,sizeof(key48))

scanf("%s",key48)

memset(dest16,0,sizeof(dest16))

Do_3DES(src16,key48,dest16,'e')

fprintf(stderr,"Result: [%s]\n",dest16)

}

else if(strcmp(argv[1],"-d") == 0)

{

fprintf(stderr,"Please input the string that you want to decrypt(16 hex number):\n")

memset(src16,0,sizeof(src16))

scanf("%s",src16)

fprintf(stderr,"Please input the Key string(16 hex number):\n")

memset(key48,0,sizeof(key48))

scanf("%s",key48)

memset(dest16,0,sizeof(dest16))

Do_3DES(src16,key48,dest16,'d')

fprintf(stderr,"Result: [%s]\n",dest16)

}

else

return -1

}

else

return -1

return 0

}

//做DES加密或解密运算

int Do_DES(char* strSrc, char* strKey, char* strDest, char flag)

{

int i,j

unsigned char subKey[16][48+1],byte8[8+1],bits[64+1],strTmp[64+1]

unsigned char L0[32+1],R0[32+1],Lx[32+1],Rx[32+1]

if(!( flag == 'e' || flag == 'E' || flag == 'd' || flag == 'D'))

return -1

if(strSrc == NULL || strKey == NULL)

return -2

if(flag == 'e' || flag == 'E')

{

memset(byte8,0,sizeof(byte8))

BCDToByte(strKey, 16, byte8)

memset(bits,0,sizeof(bits))

ByteToBit(byte8, 8, bits)

Des_GenSubKey(bits,subKey)

BCDToByte(strSrc, 16, byte8)

ByteToBit(byte8, 8, bits)

Des_IP(bits, strTmp)

memcpy(L0,strTmp,32)

memcpy(R0,strTmp+32,32)

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

{

memcpy(Lx,R0,32)

Des_F(R0,subKey[i],Rx)

Do_XOR(L0,32,Rx)

memcpy(L0,Lx,32)

memcpy(R0,Rx,32)

}

memcpy(bits,R0,32)

memcpy(bits+32,L0,32)

Des_IP_1(bits,strTmp)

BitToByte(strTmp,64,byte8)

ByteToBCD(byte8,8,strDest)

}

else

{

memset(byte8,0,sizeof(byte8))

BCDToByte(strKey, 16, byte8)

memset(bits,0,sizeof(bits))

ByteToBit(byte8, 8, bits)

Des_GenSubKey(bits,subKey)

BCDToByte(strSrc, 16, byte8)

ByteToBit(byte8, 8, bits)

Des_IP(bits, strTmp)

memcpy(L0,strTmp,32)

memcpy(R0,strTmp+32,32)

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

{

memcpy(Lx,R0,32)

Des_F(R0,subKey[15-i],Rx)

Do_XOR(L0,32,Rx)

memcpy(L0,Lx,32)

memcpy(R0,Rx,32)

}

memcpy(bits,R0,32)

memcpy(bits+32,L0,32)

Des_IP_1(bits,strTmp)

BitToByte(strTmp,64,byte8)

ByteToBCD(byte8,8,strDest)

}

return 0

}

//做3DES加密或解密运算

int Do_3DES(char* strSrc, char* strKey, char* strDest, char flag)

{

unsigned char strBCDKey[32+1],strByteKey[16+1]

unsigned char strMidDest1[16+1],strMidDest2[16+1]

unsigned char strLKey[16+1],strMKey[16+1],strRKey[16+1]

if(!( flag == 'e' || flag == 'E' || flag == 'd' || flag == 'D'))

return -1

if(strSrc == NULL || strKey == NULL)

return -2

if(strlen(strKey) <32)

return -3

if(flag == 'e' || flag == 'E')

{

memset(strBCDKey,0,sizeof(strBCDKey))

memcpy(strBCDKey,strKey,32)

memset(strLKey,0,sizeof(strLKey))

memcpy(strLKey,strBCDKey,16)

memset(strRKey,0,sizeof(strRKey))

memcpy(strRKey,strBCDKey+16,16)

Do_DES(strSrc,strLKey,strMidDest1,'e')

Do_DES(strMidDest1,strRKey,strMidDest2,'d')

Do_DES(strMidDest2,strLKey,strMidDest1,'e')

memcpy(strDest,strMidDest1,16)

}

else

{

memset(strBCDKey,0,sizeof(strBCDKey))

memcpy(strBCDKey,strKey,32)

memset(strLKey,0,sizeof(strLKey))

memcpy(strLKey,strBCDKey,16)

memset(strRKey,0,sizeof(strRKey))

memcpy(strRKey,strBCDKey+16,16)

Do_DES(strSrc,strLKey,strMidDest1,'d')

Do_DES(strMidDest1,strRKey,strMidDest2,'e')

Do_DES(strMidDest2,strLKey,strMidDest1,'d')

memcpy(strDest,strMidDest1,16)

}

return 0

}

#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]