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