395 lines
9.6 KiB
C++
395 lines
9.6 KiB
C++
#include "dsrcryption.h"
|
|
#include <QString>
|
|
#include <QTime>
|
|
|
|
DsrCryption::DsrCryption()
|
|
{
|
|
m_initflag = 0;
|
|
m_cryword = 0;
|
|
memset(m_factors, 0, BYTES_OF_CRY_FACTORS);
|
|
}
|
|
|
|
// 初始化加密控制, 生成加密字和加密因子
|
|
int DsrCryption::InitDsrCryptionCtrl(int version, unsigned int cryword, const unsigned char * factors)
|
|
{
|
|
int rslt = 0;
|
|
|
|
m_initflag = 0;
|
|
m_cryword = 0;
|
|
memset(m_factors, 0, BYTES_OF_CRY_FACTORS);
|
|
|
|
if (version >= 0)
|
|
{
|
|
rslt = CreateCryWord(version);
|
|
}
|
|
else
|
|
{
|
|
m_cryword = cryword;
|
|
}
|
|
|
|
if (rslt == 0)
|
|
{
|
|
rslt = CreateCryFactors(factors);
|
|
}
|
|
|
|
if (rslt == 0)
|
|
{
|
|
m_initflag++;
|
|
}
|
|
|
|
return rslt;
|
|
}
|
|
|
|
// 获取加密字
|
|
unsigned int DsrCryption::GetDsrCryptionWord()
|
|
{
|
|
return m_cryword;
|
|
}
|
|
|
|
// 加密数据
|
|
int DsrCryption::EnCryption(unsigned char * pData, int size)
|
|
{
|
|
if (pData == NULL || size <= 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
unsigned char thisfactors[BYTES_OF_CRY_FACTORS];
|
|
unsigned char tempbuff[BYTES_OF_CRY_FACTORS];
|
|
|
|
memcpy(thisfactors, m_factors, BYTES_OF_CRY_FACTORS); // 拷贝临时的加密因子,做计算用
|
|
|
|
int i, j;
|
|
for (i = 0; i < size; i += BYTES_OF_CRY_FACTORS)
|
|
{
|
|
// 拷贝数据到临时buff
|
|
int mv = 0;
|
|
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
if (i+j < size)
|
|
{
|
|
tempbuff[j] = pData[i+j]; // 拷贝数据
|
|
}
|
|
else
|
|
{
|
|
tempbuff[j] = 0;
|
|
}
|
|
|
|
mv += thisfactors[j]; // 累加因子,作为移动因子
|
|
}
|
|
|
|
// 移动数据
|
|
if (i + BYTES_OF_CRY_FACTORS < size)
|
|
{
|
|
// 生成移动索引
|
|
unsigned char mvidx[BYTES_OF_CRY_FACTORS];
|
|
int idx, setdidx = BYTES_OF_CRY_FACTORS-1;
|
|
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
idx = (mv >> j) & 0x1f;
|
|
for (int k = 0; k < j; k++)
|
|
{
|
|
if (mvidx[k] == idx)
|
|
{
|
|
idx = setdidx;
|
|
do
|
|
{
|
|
int kk;
|
|
for (kk = 0; kk < j; kk++)
|
|
{
|
|
if (mvidx[kk] == idx)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
if (kk < j)
|
|
{
|
|
idx--;
|
|
}
|
|
else
|
|
{
|
|
setdidx = idx-1;
|
|
break;
|
|
}
|
|
} while(1);
|
|
break;
|
|
}
|
|
}
|
|
mvidx[j] = idx;
|
|
}
|
|
|
|
// 移动数据
|
|
unsigned char tempdat[BYTES_OF_CRY_FACTORS];
|
|
memcpy(tempdat, tempbuff, BYTES_OF_CRY_FACTORS);
|
|
|
|
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
tempbuff[j] = tempdat[mvidx[j]];
|
|
}
|
|
}
|
|
|
|
// 数据加密
|
|
for (j = 0; i+j < size && j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
tempbuff[j] ^= thisfactors[j]; // 异或加密
|
|
pData[i+j] = tempbuff[j]; // 保存
|
|
}
|
|
|
|
// 下次的变幻因子
|
|
int temp = 0;
|
|
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
temp += thisfactors[j];
|
|
temp *= 3;
|
|
temp += 1;
|
|
temp /= 2;
|
|
thisfactors[j] = temp;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// 解密数据
|
|
int DsrCryption::DeCryption(unsigned char * pData, int size)
|
|
{
|
|
if (pData == NULL || size <= 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if (pData == NULL || size <= 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
unsigned char thisfactors[BYTES_OF_CRY_FACTORS];
|
|
unsigned char tempbuff[BYTES_OF_CRY_FACTORS];
|
|
|
|
memcpy(thisfactors, m_factors, BYTES_OF_CRY_FACTORS);
|
|
|
|
int i, j;
|
|
for (i = 0; i < size; i += BYTES_OF_CRY_FACTORS)
|
|
{
|
|
// 拷贝数据到临时buff
|
|
int mv = 0;
|
|
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
if (i+j < size)
|
|
{
|
|
tempbuff[j] = pData[i+j]; // 拷贝数据
|
|
}
|
|
else
|
|
{
|
|
tempbuff[j] = 0;
|
|
}
|
|
|
|
mv += thisfactors[j]; // 累加因子,作为移动因子
|
|
}
|
|
|
|
// 数据解密
|
|
for (j = 0; i+j < size && j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
tempbuff[j] ^= thisfactors[j];
|
|
}
|
|
|
|
// 数据移动回去
|
|
if (i + BYTES_OF_CRY_FACTORS < size)
|
|
{
|
|
// 生成移动索引
|
|
unsigned char mvidx[BYTES_OF_CRY_FACTORS];
|
|
int idx, setdidx = BYTES_OF_CRY_FACTORS-1;
|
|
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
idx = (mv >> j) & 0x1f;
|
|
for (int k = 0; k < j; k++)
|
|
{
|
|
if (mvidx[k] == idx)
|
|
{
|
|
idx = setdidx;
|
|
do
|
|
{
|
|
int kk;
|
|
for (kk = 0; kk < j; kk++)
|
|
{
|
|
if (mvidx[kk] == idx)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
if (kk < j)
|
|
{
|
|
idx--;
|
|
}
|
|
else
|
|
{
|
|
setdidx = idx-1;
|
|
break;
|
|
}
|
|
} while(1);
|
|
break;
|
|
}
|
|
}
|
|
mvidx[j] = idx;
|
|
}
|
|
|
|
// 移动数据
|
|
unsigned char tempdat[BYTES_OF_CRY_FACTORS];
|
|
memcpy(tempdat, tempbuff, BYTES_OF_CRY_FACTORS);
|
|
|
|
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
tempbuff[mvidx[j]] = tempdat[j];
|
|
}
|
|
}
|
|
|
|
// 保存解密数据
|
|
for (j = 0; i+j < size && j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
pData[i+j] = tempbuff[j]; // 保存
|
|
}
|
|
|
|
// 下次的变幻因子
|
|
int temp = 0;
|
|
for (j = 0; j < BYTES_OF_CRY_FACTORS; j++)
|
|
{
|
|
temp += thisfactors[j];
|
|
temp *= 3;
|
|
temp += 1;
|
|
temp /= 2;
|
|
thisfactors[j] = temp;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int DsrCryption::goaDeCryption(unsigned char *pFileData, int nDncryption, int nFileSize)
|
|
{
|
|
if (pFileData == NULL || nDncryption == 0 || nFileSize <= 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
unsigned char n, biOffset, biTurnOn;
|
|
biOffset = (nDncryption >> 8) & 0xFF;
|
|
biTurnOn = (nDncryption >> 16) & 0xFF;
|
|
|
|
unsigned char* pDataOffset = NULL; //备份移动块数据
|
|
pDataOffset = new unsigned char[biOffset];
|
|
int nLen = nFileSize - biOffset;
|
|
|
|
//取反
|
|
for (n = 0; n < biTurnOn; n++)
|
|
{
|
|
pFileData[n] = ~pFileData[n];
|
|
}
|
|
|
|
for (n = 0; n < biOffset; n++)
|
|
{//读取移动块数据
|
|
pDataOffset[n] = pFileData[nLen + n];
|
|
}
|
|
|
|
for (int k = 0; k < nLen; k++)
|
|
{//将数据块右移 biOffset 位
|
|
pFileData[nFileSize - 1 - k] = pFileData[nLen - 1 - k];
|
|
}
|
|
|
|
for (n = 0; n < biOffset; n++)
|
|
{//将右块数据设置到左边
|
|
pFileData[n] = pDataOffset[n];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int DsrCryption::goaEncryption(unsigned char *pFileData, int nEncryption, int nFileSize)
|
|
{
|
|
if (pFileData == NULL || nEncryption == 0 || nFileSize <= 0) return -1;
|
|
|
|
unsigned char biOffset = (nEncryption >> 8) & 0xFF;
|
|
unsigned char biTurnOn = (nEncryption >> 16) & 0xFF;
|
|
|
|
if (biOffset >= nFileSize) return -1;
|
|
|
|
unsigned char* pDataOffset = new unsigned char[biOffset];
|
|
int nLen = nFileSize - biOffset;
|
|
|
|
// 1. 备份开头 biOffset 字节(它们即将被移到末尾)
|
|
for (int n = 0; n < biOffset; n++) {
|
|
pDataOffset[n] = pFileData[n];
|
|
}
|
|
|
|
// 2. 左移:把中间数据整体左移 biOffset 位
|
|
for (int k = 0; k < nLen; k++) {
|
|
pFileData[k] = pFileData[k + biOffset];
|
|
}
|
|
|
|
// 3. 把备份放到末尾
|
|
for (int n = 0; n < biOffset; n++) {
|
|
pFileData[nLen + n] = pDataOffset[n];
|
|
}
|
|
|
|
// 4. 最后取反前 biTurnOn 字节
|
|
for (int n = 0; n < biTurnOn && n < nFileSize; n++) {
|
|
pFileData[n] = ~pFileData[n];
|
|
}
|
|
|
|
delete[] pDataOffset;
|
|
return 0;
|
|
}
|
|
|
|
// 生成加密字
|
|
int DsrCryption::CreateCryWord(int version)
|
|
{
|
|
if (version < 0 || version > 250)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
int rdw;
|
|
if (version == 0)
|
|
{
|
|
rdw = 0;
|
|
}
|
|
else
|
|
{
|
|
QTime time= QTime::currentTime();
|
|
qsrand(time.msec()+time.second()*1000);
|
|
rdw = qrand(); // 产生随机数
|
|
}
|
|
|
|
m_cryword = rdw & 0xffffff;
|
|
m_cryword *= 251;
|
|
m_cryword += version;
|
|
|
|
return 0;
|
|
}
|
|
|
|
// 生成加密因子
|
|
int DsrCryption::CreateCryFactors(const unsigned char * factors)
|
|
{
|
|
if (factors == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
memcpy(m_factors, factors, BYTES_OF_CRY_FACTORS);
|
|
|
|
int * pDat = (int*)m_factors;
|
|
|
|
// 变幻加密因子,兼容非加密情况
|
|
for (int i = 0; i < BYTES_OF_CRY_FACTORS; i+=sizeof(int))
|
|
{
|
|
*pDat *= m_cryword;
|
|
pDat++;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|