C語言實現(xiàn)無規(guī)律數(shù)據(jù)加密、解密功能
在網(wǎng)絡(luò)傳輸重要信息或存儲重要文件信息時,大部分會對數(shù)據(jù)加密,保證數(shù)據(jù)的安全性?;ヂ?lián)網(wǎng)上流行的可逆加密方式對數(shù)據(jù)的安全性沒有保證,便自己寫了一套安全性極高加密、解密方法。
方法的實現(xiàn)方式及特點:
1.采用指定單個字節(jié)加密轉(zhuǎn)換(轉(zhuǎn)換形式為ascll碼表中0-128的形式,由1個字節(jié)拆分為三個字節(jié),下面說明拆分方式);
2.采用數(shù)組中隨機數(shù)據(jù)減指定加密字節(jié)(比如當(dāng)前數(shù)據(jù)ascll碼為121,當(dāng)前數(shù)組中的數(shù)據(jù)為222,結(jié)果為222-121=101,當(dāng)然這個只是參考實例);
3.采用隨機指定數(shù)組方式(如果需要用到無規(guī)律加密方式,可以通過隨機指定數(shù)組方式進行加密);
4.指定很大的數(shù)據(jù)加密格式(比如使用1-2048字節(jié)中任意長度為一次的加密比例,大量數(shù)據(jù)分為多次加密);
5.多次加密數(shù)據(jù)時,第一次加密數(shù)據(jù)生成數(shù)據(jù)頭與加密信息,之后只生成加密信息(數(shù)據(jù)頭包含使用的加密數(shù)組(比如數(shù)組1、數(shù)組2、等…,)和加密字節(jié)長度,解析數(shù)據(jù)時將會根據(jù)數(shù)據(jù)頭獲取到這些信息);
6.加密字節(jié)為跳序形式(比如指定加密1,3,5字節(jié)或者指定為別的字節(jié)調(diào)序形式,只需簡單改些代碼就能實現(xiàn));
指定一個字節(jié)加密后拆分為三個字節(jié)表示為:
①第一個字節(jié)為隨機數(shù)組中的隨機數(shù)據(jù)(比如數(shù)組有8個數(shù)據(jù),第一個字節(jié)范圍0-7作為標記,用來解密使用);
②第二個字節(jié)為加密后的數(shù)據(jù)拆分的一部分(小于128用來對上ascll碼表);
③第三個字節(jié)為采用的拆分格式(解密使用)。
下面貼上加密使用的數(shù)組:
//數(shù)組中的任意數(shù)據(jù)都可以修改為1-255之間,末尾數(shù)據(jù)為0防止數(shù)組越界
unsigned char Data1[] ={255,210,208,179,168,199,202,189,0};
unsigned char Data2[] ={166,207,205,196,191,190,163,180,0};
unsigned char Data3[] ={155,197,186,172,228,226,219,239,0};
unsigned char Data4[] ={188,229,192,254,252,212,230,217,0};
unsigned char Data5[] ={229,206,212,224,253,211,181,207,0};
目前代碼中使用的是這5個數(shù)組,需要更大的隨機性可以通過簡單修改代碼,寫入更多的數(shù)組,數(shù)組中的數(shù)據(jù)在1-255(不建議寫0,字符串中0為結(jié)尾)。
數(shù)據(jù)頭定義格式:
數(shù)據(jù)頭1-3字節(jié)為“LKY”用來校驗加密后的數(shù)據(jù),如果數(shù)據(jù)中不存在,將不處理數(shù)據(jù);
數(shù)據(jù)頭4-128字節(jié)為校驗信息段,如果校驗不正確,將不處理數(shù)據(jù);
數(shù)據(jù)頭129-133字節(jié)為使用的指定數(shù)組進行加密(目前最大可以指定5個數(shù)組,同時使用5個數(shù)組進行對指定直接加密處理,修改代碼可以增加更多的數(shù)組);
數(shù)據(jù)頭134-256字節(jié)為補數(shù)據(jù);
數(shù)據(jù)頭257-260字節(jié)為指定的加密長度(加密長度為1-2048);
數(shù)據(jù)頭261-512字節(jié)為補數(shù)據(jù);
數(shù)據(jù)頭的總長度為512個字節(jié)。
下面貼上.h文件(其中包括任意格式文件的加密、解密函數(shù)):
#include <vector>
struct FileData
{
CString Filename;
LPVOID _this;
bool bCover;
};
//數(shù)據(jù)加密解密類
class DataOperation
{
public:
DataOperation();
virtual ~DataOperation();
/***************************** 加密部分 ***************************/
//設(shè)置加密數(shù)據(jù)(傳入1表示使用unsigned char Data1[] ={255,210,208,179,168,199,202,189,193,0}數(shù)組加密)傳入類型1-5,
//如果傳入數(shù)據(jù)超過5次,不再記錄
bool SetEncryptionData(int nCount);
//設(shè)備每一次加密的數(shù)據(jù)長度值為0-2048,默認使用2048
bool SetEncryptionLen(int nLen);
//加密數(shù)據(jù)函數(shù)
//返回加密完成的函數(shù)
//如果傳入的數(shù)據(jù)超過設(shè)置每一次加密的數(shù)據(jù)長度,將會采用設(shè)置的數(shù)據(jù)長度
//第一次調(diào)用會生成512字節(jié)數(shù)據(jù)頭與加密后的數(shù)據(jù)一起返回(比如需要加密3048個字節(jié)數(shù)據(jù),第一次調(diào)用函數(shù)返回數(shù)據(jù)頭和2048加密后的數(shù)據(jù),第二次調(diào)用返回剩下1000個字節(jié)加密后的數(shù)據(jù))
char *EncryptionData(char * SrcData,int & nDataLen);
//加密文件
//參數(shù)一文件完整路徑加名稱
//參數(shù)二 true為覆蓋文件 false為創(chuàng)建文件名加_Temp的新文件
bool EncryptionFile(CString Filename,bool bCover);
/**********************************************/
/****************** 解密部分 *****************************/
//解析數(shù)據(jù)頭信息,返回每一次解密需要傳入的數(shù)據(jù)長度(使用加密后的數(shù)據(jù)前512字節(jié)為數(shù)據(jù)頭信息傳入函數(shù)獲取到加密數(shù)據(jù)以及加密的數(shù)據(jù)長度等)
int DecryptionHead(char * SrcData);
//解密數(shù)據(jù)(傳入加密后的數(shù)據(jù)以及數(shù)據(jù)長度,不要帶數(shù)據(jù)頭信息)
//比如解密3048字節(jié)長度數(shù)據(jù),去掉數(shù)據(jù)512個字節(jié)數(shù)據(jù)(數(shù)據(jù)頭信息),從513字節(jié)開始為需要解析的數(shù)據(jù)
//nDataLen 為解析數(shù)據(jù)頭返回的每次需要傳入的數(shù)據(jù)長度
char *DecryptionData(const char * SrcData,int & nDataLen);
//解密文件
bool DecryptionFile(CString Filename,bool bCover);
/************************************************/
private:
//加密數(shù)據(jù)計算函數(shù)
char *EncryptionData_(char * SrcData,int & nDataLen,char *HeadData = 0);
//指定字節(jié)進行加密運算
unsigned char *Encryption_Operation(std::vector<unsigned char *> VData,unsigned char SrcData[]);
//獲取指定的加密數(shù)組
unsigned char * GetData_Operation(int nVal);
//根據(jù)指定加密長度獲取解密長度
int GetDecryptionDataLen(int nDataLen);
//指定字節(jié)進行解密運算
unsigned char *Decryption_Operation(unsigned char * VData[],unsigned char SrcData[],int nVDataLen);
private:
//保存需要使用的加密數(shù)據(jù)(只在加密數(shù)據(jù)時使用,解密時自動根據(jù)數(shù)據(jù)頭信息獲取加密數(shù)據(jù))
char m_EncryptionData[6];
//保存需要使用的解密數(shù)據(jù)
char m_DecryptionData[6];
//
int m_EncryptionDataLen;
//
int m_DecryptionDataLen;
//
bool m_bValidHead;
};
下面貼上.cpp文件:
#include "stdafx.h"
#include "Operation.h"
unsigned char Data1[] ={255,210,208,179,168,199,202,189,0};
unsigned char Data2[] ={166,207,205,196,191,190,163,180,0};
unsigned char Data3[] ={155,197,186,172,228,226,219,239,0};
unsigned char Data4[] ={188,229,192,254,252,212,230,217,0};
unsigned char Data5[] ={229,206,212,224,253,211,181,207,0};
//數(shù)組的長度
int DataLen = 8;
//獲取數(shù)組
#define GetData(nVal)\
Data##nVal;
DataOperation::DataOperation():m_EncryptionDataLen(2048),m_bValidHead(false),m_DecryptionDataLen(0)
{
memset(m_EncryptionData,0,sizeof(m_EncryptionData));
memset(m_DecryptionData,0,sizeof(m_DecryptionData));
SetEncryptionData(2);
SetEncryptionData(1);
}
DataOperation::~DataOperation()
{
}
//如果傳入數(shù)據(jù)超過5次,不再記錄
bool DataOperation::SetEncryptionData(int nCount)
{
int nLen = strlen(m_EncryptionData);
if (5 <= nLen)
return false;
m_EncryptionData[nLen] = nCount;
return true;
}
//設(shè)備每一次加密的數(shù)據(jù)長度值為0-2048,默認使用2048
bool DataOperation::SetEncryptionLen(int nLen)
{
if (0 >= nLen || 2048 < nLen)
return false;
m_EncryptionDataLen = nLen;
return true;
}
//加密數(shù)據(jù)函數(shù)
char * DataOperation::EncryptionData(char * SrcData,int & nDataLen)
{
if (0 == SrcData)
return 0;
if (!m_bValidHead)
{
//首先生出數(shù)據(jù)頭,然后與數(shù)據(jù)合并
char DataHead[513] = {0};
int nInIdex = strlen("LKY");
memcpy(DataHead,"LKY",nInIdex);
//前128位校驗數(shù)據(jù)頭信息
for (int i = 3;i < 128;i++)
{
DataHead[i] = ((DataHead[i - 1] + i)%128 + 1);
}
int ii = 0;
//129-133為使用的加密數(shù)據(jù)
for (int i = 128;i < 133;i++)
{
if (0 == m_EncryptionData[ii])
{
DataHead[i] = '0';
}
else
{
DataHead[i] = m_EncryptionData[ii];
}
++ii;
}
//134-256為補數(shù)據(jù)
for (int i = 133;i < 256;i++)
{
DataHead[i] = ((DataHead[i - 1] + i)%128 + 1);
}
//257-261為加密長度
char EncryptionDataLen[5] = {0};
itoa(m_EncryptionDataLen,EncryptionDataLen,10);
ii = 0;
for (int i = 256;i < 260;i++)
{
if (0 == EncryptionDataLen[ii])
{
DataHead[i] = '99';
}
else
{
DataHead[i] = EncryptionDataLen[ii];
}
++ii;
}
//261-512為補數(shù)據(jù)
for (int i = 260;i < 512;i++)
{
DataHead[i] = ((DataHead[i - 1] + i)%128 + 1);
}
m_bValidHead = true;
return EncryptionData_(SrcData,nDataLen,DataHead);
}
return EncryptionData_(SrcData,nDataLen);
}
//加密數(shù)據(jù)計算函數(shù)
char *DataOperation::EncryptionData_(char * SrcData,int & nLen,char *HeadData)
{
char pStrData[2048 + 513 + 26] = {0};
int nIndex = 0;
if (0 != HeadData)
{
memcpy(pStrData,HeadData,512);
nIndex += 512;
}
int nOffset = 0,nLeft = 0;
int nDataLen = (m_EncryptionDataLen <= nLen ? m_EncryptionDataLen : nLen);
//獲取加密數(shù)組
std::vector<unsigned char *>VData;
for(int ilen = 0;ilen < strlen(m_EncryptionData);ilen++)
{
int nVal = m_EncryptionData[ilen];
unsigned char * DataArray = GetData_Operation(nVal);
VData.push_back(DataArray);
}
int i = 0;
//開始加密數(shù)據(jù)
for (;i < nDataLen;(i = i * 2 + 1))
{
//拷貝沒有加密的數(shù)據(jù)
if (0 < i - nLeft)
{
memcpy(pStrData + nIndex,SrcData + nLeft,i - nLeft);
nIndex += i - nLeft;
}
unsigned char StrTemp[4] = {0,SrcData[i],0,0};
Encryption_Operation(VData,StrTemp);
if(128 <= StrTemp[1])
{
StrTemp[1] = StrTemp[1] - 127;
StrTemp[2] = 127;
}
else if (0 == StrTemp[1])
{
StrTemp[1] = '0';
StrTemp[2] = '0';
}
else
{
StrTemp[1] = 128 - StrTemp[1];
StrTemp[2] = '1';
}
//拷貝轉(zhuǎn)換過的數(shù)據(jù)
memcpy(pStrData + nIndex,StrTemp,strlen((char *)StrTemp));
nIndex += strlen((char *)StrTemp);
nLeft = i + 1;
}
if (nLeft < nDataLen && 0 != nIndex)
{
memcpy(pStrData + nIndex,SrcData + nLeft,nDataLen - nLeft);
nIndex += nDataLen - nLeft;
}
else if (0 == nIndex)
{
nLen = nDataLen;
return pStrData;
}
nLen = nIndex;
return pStrData;
}
//指定字節(jié)進行加密運算
unsigned char *DataOperation::Encryption_Operation(std::vector<unsigned char *> VData,unsigned char SrcData[])
{
static ULONG64 StrEncryptionVal = 0;
//第一個字節(jié)標記加密數(shù)組的字節(jié)位置
SrcData[0] = (StrEncryptionVal % DataLen + '0');
for (auto it = VData.begin();it != VData.end();it++)
{
unsigned char * data = *it;
SrcData[1] = (data[SrcData[0] - '0']) - SrcData[1];
}
++StrEncryptionVal;
return SrcData;
}
//獲取指定的加密數(shù)組
unsigned char * DataOperation::GetData_Operation(int nVal)
{
switch (nVal)
{
case 1:
{
return GetData(1);
}
break;
case 2:
{
return GetData(2);
}
break;
case 3:
{
return GetData(3);
}
break;
case 4:
{
return GetData(4);
}
break;
case 5:
{
return GetData(5);
}
break;
}
return 0;
}
//解析數(shù)據(jù)頭信息,返回每一次解密需要傳入的數(shù)據(jù)長度(使用加密后的數(shù)據(jù)前512字節(jié)為數(shù)據(jù)頭信息傳入函數(shù)獲取到加密數(shù)據(jù)以及加密的數(shù)據(jù)長度等)
int DataOperation::DecryptionHead(char * SrcData)
{
if (0 == SrcData || 512 > strlen(SrcData))
return 0;
char pSrcData[513] = {0};
memcpy(pSrcData,SrcData,512);
if (pSrcData[0] != 'L' || pSrcData[1] != 'K' || pSrcData[2] != 'Y')
return 0;
//前128位校驗數(shù)據(jù)頭信息
int i = 127;
for (;i > 3;i--)
pSrcData[i - 1] = ((pSrcData[i] + i)%128 - pSrcData[i - 1] - 1);
if (pSrcData[i - 1] != 'Y')
return 0;
//129-134為使用的加密數(shù)據(jù)
i = 128;
int ii = 0;
memset(m_DecryptionData,0,sizeof(m_DecryptionData));
for (;i < 133;i++)
{
if ('0' == pSrcData[i])
{
continue;
}
else
{
m_DecryptionData[ii++] = pSrcData[i];
}
}
//257-261為加密長度
char EncryptionDataLen[5] = {0};
ii = 0;
i = 256;
for (;i < 260;i++)
{
if (pSrcData[i] == '99')
{
continue;
}
else
{
EncryptionDataLen[ii++] = pSrcData[i];
}
}
m_EncryptionDataLen = atoi(EncryptionDataLen);
m_DecryptionDataLen = GetDecryptionDataLen(m_EncryptionDataLen);
return m_DecryptionDataLen;
}
//根據(jù)指定加密長度獲取解密長度
int DataOperation::GetDecryptionDataLen(int nDataLen)
{
if (0 >= nDataLen)
return 0;
int nIndex = 0;
for (int i = 0;i < nDataLen;(i = i * 2 + 1))
{
nIndex += 2;
}
return nDataLen + nIndex;
}
//解密數(shù)據(jù)(傳入加密后的數(shù)據(jù)以及數(shù)據(jù)長度,不要帶數(shù)據(jù)頭信息)
char *DataOperation::DecryptionData(const char * SrcData,int & nDataLen)
{
if (0 == SrcData || 0 >= nDataLen)
return 0;
char Data[2048 + 100] = {0};
int nIndex = 0;
int nOffset = 0,nLeft = 0,nCurrent = 0;
int nLen = (m_DecryptionDataLen <= nDataLen ? m_DecryptionDataLen : nDataLen);
//獲取解密
int nDecryptionDataLen = strlen(m_DecryptionData);
unsigned char *VData[10] = {0};
int nVDataLen = 0;
for(int iLen = nDecryptionDataLen;iLen > 0;iLen--)
{
int nVal = m_DecryptionData[iLen - 1];
unsigned char * DataArray = GetData_Operation(nVal);
VData[nVDataLen++] = DataArray;
}
int i = 0;
//開始加密數(shù)據(jù)
for (;i < nLen;(i = i * 2 + 1))
{
nCurrent = i + nOffset;
if (nCurrent >= nDataLen)
{
break;
}
//拷貝沒有加密的數(shù)據(jù)
if (0 < nCurrent - nLeft)
{
memcpy(Data + nIndex,SrcData + nLeft,nCurrent - nLeft);
nIndex += (nCurrent - nLeft);
}
unsigned char StrTemp[4] = {SrcData[nCurrent],SrcData[nCurrent + 1],SrcData[nCurrent + 2],0};
if (127 == StrTemp[2])
{
StrTemp[1] = StrTemp[1] + 127;
StrTemp[2] = 0;
}
else if ('1' == StrTemp[2])
{
StrTemp[1] = 128 - StrTemp[1];
StrTemp[2] = 0;
}
else if ('0' == StrTemp[2])
{
StrTemp[1] = 0;
StrTemp[2] = 0;
}
else
{
StrTemp[2] = 0;
}
Decryption_Operation(VData,StrTemp,nDecryptionDataLen);
//拷貝轉(zhuǎn)換過的數(shù)據(jù)
memcpy(Data + nIndex,StrTemp + 1,1);
nIndex += 1;
nOffset += 2;
nLeft = i + nOffset + 1;
}
if (nLeft < nLen && 0 != nIndex)
{
memcpy(Data + nIndex,SrcData + nLeft,nLen - nLeft);
nIndex += nLen - nLeft;
}
else if (0 == nIndex)
{
return Data;
}
nDataLen = nIndex;
return Data;
}
//指定字節(jié)進行解密運算
unsigned char *DataOperation::Decryption_Operation(unsigned char * VData[],unsigned char SrcData[],int nVDataLen)
{
for (int i = 0;i < nVDataLen;i++)
{
unsigned char * data = VData[i];
SrcData[1] = (data[SrcData[0] - '0']) - SrcData[1];
}
return SrcData;
}
//加密文件
bool DataOperation::EncryptionFile(CString Filename,bool bCover)
{
//增加隨機加密 默認使用2,1數(shù)組
SetEncryptionData(5);
SetEncryptionData(4);
if (Filename.IsEmpty())
return false;
CFile file1,file2;
if (!file1.Open(Filename,CFile::modeRead))
return false;
ULONG64 nFileLen = file1.GetLength();
if (0 == nFileLen)
return false;
CString Filename2(Filename.Mid(0,Filename.ReverseFind(_T('.'))));
Filename2.AppendFormat(_T("_Temp%s"),Filename.Mid(Filename.ReverseFind(_T('.')),
Filename.GetLength() - Filename.ReverseFind(_T('.'))));
if (!file2.Open(Filename2,CFile::modeCreate | CFile::modeWrite))
return false;
char StrData[4096] = {0};
int nDataLen = 0;
while (0 < nFileLen)
{
if (2048 <= nFileLen)
{
file1.Read(StrData,2048);
nDataLen = 2048;
char *WriteFile = EncryptionData(StrData,nDataLen);
file2.Write(WriteFile,nDataLen);
nFileLen -= 2048;
}
else
{
file1.Read(StrData,nFileLen);
nDataLen = nFileLen;
char *WriteFile = EncryptionData(StrData,nDataLen);
file2.Write(WriteFile,nDataLen);
nFileLen -= nFileLen;
break;
}
}
file1.Close();
file2.Close();
if (bCover)
{
USES_CONVERSION;
//覆蓋本地文件
int nResult = remove(T2A(Filename));
nResult = rename(T2A(Filename2),T2A(Filename));
}
return true;
}
//解密文件
bool DataOperation::DecryptionFile(CString Filename,bool bCover)
{
if (Filename.IsEmpty())
return false;
CFile file1,file2;
if (!file1.Open(Filename,CFile::modeRead))
return false;
ULONG64 nFileLen = file1.GetLength();
if (512 >= nFileLen)
return false;
CString Filename2(Filename.Mid(0,Filename.ReverseFind(_T('.'))));
Filename2.AppendFormat(_T("_Temp%s"),Filename.Mid(Filename.ReverseFind(_T('.')),
Filename.GetLength() - Filename.ReverseFind(_T('.'))));
if (!file2.Open(Filename2,CFile::modeCreate | CFile::modeWrite))
return false;
char StrData[2048 + 100] = {0};
int nDataLen = 0;
file1.Read(StrData,512);
//解密數(shù)據(jù)頭
int nDecryptionLen = DecryptionHead(StrData);
if (0 >= nDecryptionLen)
return false;
nFileLen -= 512;
while (0 < nFileLen)
{
if (nDecryptionLen <= nFileLen)
{
nDataLen = nDecryptionLen;
file1.Read(StrData,nDataLen);
char *WriteFile = DecryptionData(StrData,nDataLen);
memset(StrData,0,strlen(StrData));
memcpy(StrData,WriteFile,nDataLen);
file2.Write(StrData,nDataLen);
nFileLen -= nDecryptionLen;
}
else
{
nDataLen = nFileLen;
file1.Read(StrData,nFileLen);
char *WriteFile = DecryptionData(StrData,nDataLen);
memset(StrData,0,strlen(StrData));
memcpy(StrData,WriteFile,nDataLen);
file2.Write(StrData,nDataLen);
nFileLen -= nFileLen;
break;
}
}
file1.Close();
file2.Close();
if (bCover)
{
USES_CONVERSION;
//覆蓋本地文件
int nResult = remove(T2A(Filename));
nResult = rename(T2A(Filename2),T2A(Filename));
}
return true;
}
下面說下具體函數(shù)用法:
//設(shè)置加密數(shù)據(jù)(傳入1表示使用unsigned char Data1[] ={255,210,208,179,168,199,202,189,193,0}數(shù)組加密)傳入類型1-5,
//如果傳入數(shù)據(jù)超過5次,不再記錄
//這個函數(shù)需要在加密函數(shù)使用之前調(diào)用,默認采用2、1數(shù)組加密
bool SetEncryptionData(int nCount);
//設(shè)置每一次加密的數(shù)據(jù)長度值為0-2048,默認使用2048
bool SetEncryptionLen(int nLen);
//加密數(shù)據(jù)函數(shù)
//返回加密完成的函數(shù)
//如果傳入的數(shù)據(jù)超過設(shè)置每一次加密的數(shù)據(jù)長度,將會采用設(shè)置的數(shù)據(jù)長度
//第一次調(diào)用會生成512字節(jié)數(shù)據(jù)頭與加密后的數(shù)據(jù)一起返回(比如需要加密3048個字節(jié)數(shù)據(jù),第一次調(diào)用函數(shù)返回數(shù)據(jù)頭和2048加密后的數(shù)據(jù),第二次調(diào)用返回剩下1000個字節(jié)加密后的數(shù)據(jù))
char *EncryptionData(char * SrcData,int & nDataLen);
//加密文件
//參數(shù)一文件完整路徑加名稱
//參數(shù)二 true為覆蓋文件 false為創(chuàng)建文件名加_Temp的新文件
bool EncryptionFile(CString Filename,bool bCover);
//解析數(shù)據(jù)頭信息,返回每一次解密需要傳入的數(shù)據(jù)長度(使用加密后的數(shù)據(jù)前512字節(jié)為數(shù)據(jù)頭信息傳入函數(shù)獲取到加密數(shù)據(jù)以及加密的數(shù)據(jù)長度等)
int DecryptionHead(char * SrcData);
//解密數(shù)據(jù)(傳入加密后的數(shù)據(jù)以及數(shù)據(jù)長度,不要帶數(shù)據(jù)頭信息)
//比如解密3048字節(jié)長度數(shù)據(jù),去掉數(shù)據(jù)512個字節(jié)數(shù)據(jù)(數(shù)據(jù)頭信息),從513字節(jié)開始為需要解析的數(shù)據(jù)
//nDataLen 為解析數(shù)據(jù)頭返回的每次需要傳入的數(shù)據(jù)長度
char *DecryptionData(const char * SrcData,int & nDataLen);
//解密文件
//參數(shù)一文件完整路徑加名稱
//參數(shù)二 true為覆蓋文件 false為創(chuàng)建文件名加_Temp的新文件
bool DecryptionFile(CString Filename,bool bCover);
函數(shù)使用方式參考加密文件和解密文件函數(shù),工程下載地址
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C++-操作符重載、并實現(xiàn)復(fù)數(shù)類詳解
欄 目:C語言
本文標題:C語言實現(xiàn)無規(guī)律數(shù)據(jù)加密、解密功能
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/387.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery


