//加密文件算法涵数
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;
}

解决方案 »

  1.   


    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;