📄 endistbuffer.cpp
字号:
#include "StdAfx.h"
#include ".\endistbuffer.h"
/**
* 加扰缓冲区公共构造器
* 参数:
* pcID 机器码
* secLen 段长度
* secNum 第一次需要追溯到的段数,文件开始为第一段即为 0
*/
//char sss[550];
EnDistBuffer::EnDistBuffer(unsigned char* pcID,int secLen,int secNum)
{
this->pcID = new unsigned char[ID_LEN];
memcpy(this->pcID,pcID,ID_LEN);
//this->pcID = pcID;
this->secLen = secLen;
this->secNum = secNum;
this->iniPK();
gdk = new GenDistKey(pR,qR,xR);
Ri = gdk->SectionSeed(secNum);
/*memset(s,'\0',sizeof(s));
Ri.GetStr(s);
printf("%s\n",s);*/
this->tosclen=0;
this->initialKey(Ri);
}
/**
* 加扰缓冲区,由于是对缓存区直接异或加密,所有如有需要请备份好原缓冲区内容
* 参数:
* buf 源缓冲区
* len 源缓冲区长度
* 返回:加扰后的缓冲区指针
*/
unsigned char * EnDistBuffer::EnBuffer(unsigned char *buf,int len)
{
tosclen+=len;
for(int i =0; i<len; i++)
{
buf[i]^=blckKey[i%KBL];
buf[i]^=blckKey[KBL-i%KBL-1];
if((i+1)%KBL==0) nextKey(); //待改进,可以少做一次
}
if(tosclen == secLen)
{
initialKey(Ri);
tosclen =0;
secNum;
}
return buf;
}
/**
* 初始化密钥
*/
void EnDistBuffer::initialKey(BigInt Rx)
{
long len = Rx.m_nLength;
unsigned long *val = Rx.m_ulValue;
memset(blckKey,0,sizeof(blckKey));
//for(int i=0; i<KBL; i++) blckKey[i] = 0;
/*memset(sss,'\0',sizeof(sss));
Ri.GetStr(sss);
printf("%s\n",sss);*/
/*printf("len===%d\n",len);
for(int i=0; i<len; i++)
printf("%ld=",val[i]);
printf("\n");*/
if(len>=KBL)
{
for(int i=0; i<len; i++)
{
blckKey[i%KBL]^=(unsigned char)(((unsigned char)((__int64)val[i]*PRM3%PRM2))^blckKey[KBL-i%KBL-1]);
//printf("%x-",blckKey[i%KBL]);
}
//printf("\n====**********************************+++++++++++++===========\n");
}
else
{
for(int i=0; i<KBL; i++)
{
blckKey[i]^=(unsigned char)(((unsigned char)((__int64)val[i%KBL]*PRM3%PRM2))^blckKey[KBL-i-1]);
}
}
/*for(int i=0; i<KBL; i++)
printf("%x-",blckKey[i]);
printf("\n");*/
/*for(int i=0; i<KBL; i++)
printf("%x-",pcID[i]);
printf("\n");*/
Ri=gdk->NextSeed(Rx);
}
/**
* 求当前密钥的下一个密钥
*/
void EnDistBuffer::nextKey()
{
for(int i=0; i<KBL; i++)
{
blckKey[i]^=(unsigned char)(PRM1*blckKey[KBL-i-1]%PRM2);
}
}
void EnDistBuffer::iniPK()
{
int l1,l2,l3;
l1 = strlen(PP);
l2 = strlen(PQ);
l3 = strlen(PX);
//printf("%d %d %d\n",l1,l2,l3);
//getchar();
pR = new char[l1+1];
qR = new char[l2+1];
xR = new char[l3+1];
memset(pR,'\0',sizeof(pR));
memset(qR,'\0',sizeof(qR));
memset(xR,'\0',sizeof(xR));
strcpy(pR,PP);
strcpy(qR,PQ);
strcpy(xR,PX);
/*for(int i=1; i<l1; i++)
{
for(int j=i; j<l1; j++)
pR[j]=(char)((int)pR[j]*pcID[j%KBL]%DECI);
}
for(int i=l2-1; i>0; i--)
{
for(int j=i; j<l2; j++)
qR[i]=(char)((int)pR[j]*pcID[j%KBL]%DECI);
}*/
for(int i=1; i<l3; i++)
{
for(int j=l3-1; j>=i; j--)
xR[j]=(char)((int)xR[j]*pcID[j%KBL]%DECI)+'0';
}
//printf("%s=\n\n",xR);
}
EnDistBuffer::~EnDistBuffer(void)
{
delete(gdk);
delete[] pcID;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -