//加密文件算法涵数
BOOL CEDstarDlg::EncryptFile(CString filename,char *password)
{
SetFileAttributes(filename,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL);
CFile m_file;
if(m_file.Open(filename,CFile::modeReadWrite|CFile::typeBinary))
{
char m_buffer[3001];
m_file.Read(m_buffer,3000);
//判断文件头八个字符是否为指定字符,
//是的话,则是加密过的,不用再加密了。
if(strncmp(m_buffer,"加密之星",8)==0)
{
m_file.Close();
return false;
}
//取头3000字节按位于密码相与,
//并将其存于文件的未尾处。
int m_len=strlen(password);
for(int i=0;i<3000;i++)
m_buffer[i]^=password[i%m_len];
m_len=m_file.GetLength();
m_file.SeekToEnd();
m_file.Write(m_buffer,3000); //在加密后的文件开头处设置一特征字符串,
//并将其它一些重要特征字符于一固定字符
//串PW相与后,再将其存入文件开头处。
memset(m_buffer,0,3001);
strcpy(m_buffer,"加密之星");
int *data=(int *)&m_buffer[8];
data[0]=m_len;
data[1]=strlen(password);
strcpy((char *)&m_buffer[2*sizeof(int)+8],password);
int temp=(2*sizeof(int)+8)+strlen(password);
char * PW="xujingzhou";
int m_PWlen=strlen(PW);
for(int j=8;j<= temp;j++)
m_buffer[j]^=PW[j%m_PWlen];
m_file.SeekToBegin();
if(m_len<3000)
m_file.Write(m_buffer,m_len);
else
m_file.Write(m_buffer,3000); m_file.Close();
return true;
}
return false;
}
BOOL CEDstarDlg::EncryptFile(CString filename,char *password)
{
SetFileAttributes(filename,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL);
CFile m_file;
if(m_file.Open(filename,CFile::modeReadWrite|CFile::typeBinary))
{
char m_buffer[3001];
m_file.Read(m_buffer,3000);
//判断文件头八个字符是否为指定字符,
//是的话,则是加密过的,不用再加密了。
if(strncmp(m_buffer,"加密之星",8)==0)
{
m_file.Close();
return false;
}
//取头3000字节按位于密码相与,
//并将其存于文件的未尾处。
int m_len=strlen(password);
for(int i=0;i<3000;i++)
m_buffer[i]^=password[i%m_len];
m_len=m_file.GetLength();
m_file.SeekToEnd();
m_file.Write(m_buffer,3000); //在加密后的文件开头处设置一特征字符串,
//并将其它一些重要特征字符于一固定字符
//串PW相与后,再将其存入文件开头处。
memset(m_buffer,0,3001);
strcpy(m_buffer,"加密之星");
int *data=(int *)&m_buffer[8];
data[0]=m_len;
data[1]=strlen(password);
strcpy((char *)&m_buffer[2*sizeof(int)+8],password);
int temp=(2*sizeof(int)+8)+strlen(password);
char * PW="xujingzhou";
int m_PWlen=strlen(PW);
for(int j=8;j<= temp;j++)
m_buffer[j]^=PW[j%m_PWlen];
m_file.SeekToBegin();
if(m_len<3000)
m_file.Write(m_buffer,m_len);
else
m_file.Write(m_buffer,3000); m_file.Close();
return true;
}
return false;
}
function EncryptFile(filename :AnsiString;password :pChar):boolean;
var
iFileHandle:integer;
m_buffer:array[0..3000] of char;
m_len:integer;
i,temp:integer;
PW:AnsiString;
m_PWLen:integer;
begin
SetFileAttributes(pChar(filename),FILE_ATTRIBUTE_ARCHIVE or FILE_ATTRIBUTE_NORMAL);
iFileHandle:=FileOpen(filename,fmOpenReadWrite);
if iFileHandle>0 then
begin
FileRead(iFileHandle,m_buffer,3000);
if Pos('加密之星',m_buffer)=1 then
begin
FileClose(iFileHandle);
Result:=false;
exit;
end;
m_len:=Length(password);
for i:=0 to 2999 do
m_buffer[i]:=Chr(Ord(m_buffer[i]) and Ord(password[i mod m_len]));
FileSeek(iFileHandle,0,0);
m_Len:=FileSeek(iFileHandle,0,2);
FileWrite(iFileHandle,m_buffer,3000);
for i:=0 to 2999 do
m_buffer[i]:=#0;
copymemory(Pointer(@m_buffer[0]),pChar('加密之星'),length('加密之星'));
PInteger(@m_buffer[8])^:=m_len;
PInteger(@m_buffer[8+sizeof(integer)])^:=Length(password);
copymemory(POinter(@m_buffer[2*sizeof(integer)+8]),password,length(password));
temp:=2*sizeof(integer)+8+Length(password);
PW:='xujingzhou';
m_PWLen:=length(PW);
for i:=8 to temp do
m_Buffer[i]:=Char(Ord(m_buffer[i]) and Ord(PW[i mod m_PWLen+1]));
FileSeek(iFileHandle,0,0);
if m_len<3000 then
FileWrite(iFileHandle,m_buffer,m_len)
else
FileWrite(iFileHandle,m_buffer,3000);
FileClose(iFileHandle);
Result:=true;
exit;
end;
Result:=false;
end;