📄 1-tst-interfacr.cpp
字号:
#include<stdio.h>
#include"3DES-WjcDes.cpp"
#include<time.h>
#include"rc4.cpp"
///////////////////////////////////////////////
//static bool SubKey[2][16][48];// 16圈子密钥
static int readbyte=0;
///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
int En_encryption(unsigned char *uchIn,unsigned char *uchOut,unsigned int iPatten,const char *KEY, int iEncryptionAlgorithm);
int En_decryption(unsigned char *uchIn,
unsigned char *uchOut,
unsigned int iPatten,
unsigned char *KEY,
int iEncryptionAlgorithm);
void IntToBit(bool *bOut,unsigned int uiIn,int iBits);
void StartKey(const char* KEY, int iLen,int iEncryptionAlgorithm);
void start_rc4_key1(unsigned char *uchOut,const char *KEY,unsigned char *uchIv);
////////////////////////////////////////////////////////////////////////////////////////////
/*return 0:encrypt successful
1:false of encrypt
*uchIn:the original text
*uchOut:the encrypted text
iPatten:encrypt mode,16bits
每个bit对应一个8字节的数据单元,共128字节;
当对应的位是1,该数据单元加密;
对应的字节是0,该数据单元不加密;
例如: iPatten 是 FF00, 表示128个字节中的前64字节加密,后64字节不加密
iPatten 是 AAAA, 表示每隔8个字节加密一次
iPatten 是 FFFF,表示所有的字节加密
iPatten 是 0000,表示所有的字节不加密
*KEY,加密使用的密钥,和算法对应
encryption_algorithm 加密算法,是DES, TRIPLE_DES
*/
int En_encryption(unsigned char *uchIn,unsigned char *uchOut,unsigned int iPatten,const char *KEY,int iEncryptionAlgorithm)
{
bool bPTmp[16];
int i,j,iDataLen=0,iKeyLen=0;
clock_t startd,endd;
double iElaspedd=0;
unsigned char uchRc4Seed[128];
unsigned char uchTMP[256];
unsigned char uchIv[3];
memset(uchIv,0,3);
memset(uchRc4Seed,6,128);
// memset(uchTMP,0,256);
memset(bPTmp,0,16);
IntToBit(bPTmp,iPatten,16);
// if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) )
// return false;
switch(iEncryptionAlgorithm)
{
///////////////////////////////////////
case 1:/*DES*/
if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) )
return false;
while(KEY[iKeyLen]!='\0')
iKeyLen++;
StartKey(KEY,iKeyLen,iEncryptionAlgorithm);
for(i=0,j=readbyte>>3;i<j;i++,uchOut+=8,uchIn+=8)
{
if(bPTmp[i%16]!=0)
{
DES((char *)uchOut, (char *)uchIn, &SubKey[0],true);
}
else
{
memcpy(uchOut,uchIn,8);
}
}
break;
///////////////////////////////////////////
case 2:/*3DES*/
if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) )
return false;
while(KEY[iKeyLen]!='\0')
iKeyLen++;
StartKey(KEY,iKeyLen,iEncryptionAlgorithm);
for(i=0,j=readbyte>>3;i<j;i++,uchOut+=8,uchIn+=8)
{
if(bPTmp[i%16]!=0)
{
DES((char *)uchOut,(char *)uchIn, &SubKey[0], true);
DES((char *)uchOut,(char *)uchOut, &SubKey[1], false);
DES((char *)uchOut,(char *)uchOut, &SubKey[0], true); }
else
{
memcpy(uchOut,uchIn,8);
}
}
break;
/////////////////////////////////////////////
case 3:/*rc4*/
memcpy(uchIv,uchIn+256,3);
memset(uchIn+256,0,3);
// memset(uchRc4Seed,6,sizeof(uchRc4Seed));
start_rc4_key1(uchRc4Seed,KEY,uchIv);
Encrypt(uchRc4Seed,readbyte,uchIn);
break;
}
return 0;
}
/********************************************************************
int En_decryption(unsigned char *uchIn,
unsigned char *uchOut,
unsigned int iPatten,
unsigned char *KEY,
int encrpypt_algorithm);
返回值: 0 解密成功
1 解密失败
参数: *uchIn 输入的加密的密文
*uchOut 输出的解密后的明文
iPatten 加密模式,unsigned int 长度为16bits,;
每个bit对应一个8字节的数据单元,共128字节;
当对应的位是1,该数据单元解密;
对应的字节是0,该数据单元不解密;
例如: iPatten 是 FF00, 表示128个字节中的前64字节解密,后64字节不解密
iPatten 是 AAAA, 表示每隔8个字节解密一次
iPatten 是 FFFF,表示所有的字节解密
iPatten 是 0000,表示所有的字节不解密
*KEY,解密使用的密钥,和算法对应
encryption_algorithm 解密算法,是DES, TRIPLE_DES
********************************************************************/
int En_decryption(unsigned char *uchIn,unsigned char *uchOut,unsigned int iPatten,const char *KEY,int iEncryptionAlgorithm)
{
bool bPTmp[16];
int i,j,iDataLen=0,iKeyLen=0;
clock_t startd,endd;
double iElaspedd=0;
unsigned char uchRc4Seed[128];
unsigned char uchIv[3];
memset(bPTmp,0,16);
IntToBit(bPTmp,iPatten,16);
memset(uchRc4Seed,6,128);
memset(uchIv,0,3);
switch(iEncryptionAlgorithm)
{
///////////////////////////////////
case 1:/*DES*/
if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) )
return false;
while(KEY[iKeyLen]!='\0')
iKeyLen++;
StartKey(KEY,iKeyLen,iEncryptionAlgorithm);
for(i=0,j=readbyte>>3;i<j;i++,uchOut+=8,uchIn+=8)
{
if(bPTmp[i%16]!=0)
{
DES((char *)uchOut, (char *)uchIn, &SubKey[0],false);
}
else
{
memcpy(uchOut,uchIn,8);
}
}
break;
////////////////////////////////////////////////////
case 2:/*3DES*/
if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) )
return false;
while(KEY[iKeyLen]!='\0')
iKeyLen++;
StartKey(KEY,iKeyLen,iEncryptionAlgorithm);
for(i=0,j=readbyte>>3;i<j;i++,uchOut+=8,uchIn+=8)
{
if(bPTmp[i%16]!=0)
{
DES((char *)uchOut,(char *)uchIn, &SubKey[0], false);
DES((char *)uchOut,(char *)uchOut, &SubKey[1], true);
DES((char *)uchOut,(char *)uchOut, &SubKey[0], false); }
else
{
memcpy(uchOut,uchIn,8);
}
}
break;
////////////////////////////////////////////////////////////
case 3:
memcpy(uchIv,uchIn+256,3);
memset(uchIn+256,0,3);
// memset(uchRc4Seed,6,sizeof(uchRc4Seed));
start_rc4_key1(uchRc4Seed,KEY,uchIv);
Decrypt(uchRc4Seed,readbyte,uchIn);
break;
}
return 0;
}
void StartKey(const char* KEY, int iLen,int iEncryptionAlgorithm)
{
memset(deskey, 0, 16);
if(iEncryptionAlgorithm=1)
memcpy(deskey,KEY,iLen<8?iLen:8);
if(iEncryptionAlgorithm=2)
memcpy(deskey,KEY,iLen>16?16:iLen);
SetSubKey(&SubKey[0], &deskey[0]);
}
void IntToBit(bool *bOut,unsigned int uiIn,int iBits)
{
for(int i=0; i<iBits; ++i)
bOut[i] = (uiIn>>(15-i)) & 1;
}
void start_rc4_key1(unsigned char *uchOut,const char *KEY,unsigned char *uchIv)
{
unsigned char uchTMP[16];
memset(uchTMP,0,16);
memcpy(uchTMP,KEY,13);
memcpy(uchTMP+13,uchIv,3);
ByteToBit((char *)uchOut,(const char *)uchTMP,128);
}
#if 0
void main(void)
{
const char *KEY="CeressiaJasminea";
unsigned char uchOut[1024];
clock_t start,end;
double elapsed;
unsigned char buf[1024];
FILE *fd1, *fd2, *fd3,*fd4;
memset(uchOut,0,1024);
fd1=fopen("h:\\txt\\5.wma","rb");
fd2=fopen("h:\\txt\\c5.wma","wb");
// fd4=fopen("h:\\txt\\po.txt","wb");
start = clock();
while(!feof(fd1))
{
memset(buf,0,1024);
memset(uchOut,0,1024);
readbyte=fread(buf,sizeof(char),1024,fd1);
En_encryption(buf,uchOut,0xffff,KEY,2);
// Encryption (seed1,readbyte,buf);
fwrite(uchOut,sizeof(char),readbyte,fd2);
}
fclose(fd2);
fd3=fopen("h:\\txt\\c5.wma","rb");
fd4=fopen("h:\\txt\\p5.wma","wb");
while(!feof(fd3))
{
memset(buf,0,1024);
memset(uchOut,0,1024);
readbyte=fread(buf,sizeof(char),1024,fd3);
En_decryption(buf,uchOut,0xffff,KEY,2);
fwrite(uchOut,sizeof(char),readbyte,fd4);
}
end = clock();
elapsed = ((double)(end-start))/CLOCKS_PER_SEC;
fclose(fd1);
// fclose(fd2);
fclose(fd3);
fclose(fd4);
printf("%fOK!",elapsed);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -