如何可以做到当打开某个文件夹的时候就弹出一个密码验证窗口,如果密码正确则可以打开此文件夹,密码不正确则打不开此文件!

解决方案 »

  1.   

    首先你要确定你要打开的文件是什么文件,WIN里面的文件那是不可能的了,如果你要给明文加秘,那还是可以的,开启程序弹出一个密码验证窗口也很容易,判断返回值就行
      

  2.   

    api钩子
    2000的话可以用folder.htt来写 不过只能用来玩玩`
      

  3.   

    编程很难实现,建议使用ntfs的分区
      

  4.   

    比较复杂,需要建立一个IE的扩展;当windows打开一个目录时会调用IDispatch.Invoke函数(Invoke(DispID: Integer; const IID: TGUID;
      LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
      ArgErr: Pointer): HResult),DispId为DISPID_BEFORENAVIGATE2,此时调用函数DoBeforeNavigate2(
    procedure DoBeforeNavigate2(const pDisp: IDispatch; var URL: OleVariant;
          var Flags: OleVariant; var TargetFrameName: OleVariant;
          var PostData: OleVariant; var Headers: OleVariant; var Cancel: WordBool);)在这个函数中判断这个目录是否允许打开,如果不允许打开,cancel中返回true即可
      

  5.   

    否则就用NTFS,FAT32原理上不可能提供你想像的完美功能,这个文件系统安全项太少了
      

  6.   

    算了,不用留信箱了,我贴出来给你参考吧unit UAddShell;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ShellAPI, ExtCtrls, Buttons, ShlObj, Menus, 
      UnitLockConst;type
      TForm1 = class(TForm)
        OpenDialog1: TOpenDialog;
        ButtonOpenFile: TSpeedButton;
        ButtonEncrypt: TBitBtn;
        EditPassword1: TEdit;
        EditPassword2: TEdit;
        ButtonUnEncrypt: TBitBtn;
        EditFileName: TEdit;
        CheckBox1: TCheckBox;
        LabelPassword1: TLabel;
        LabelPassword2: TLabel;
        LabelFileName: TLabel;
        procedure ButtonEncryptClick(Sender: TObject);
        procedure ButtonOpenFileClick(Sender: TObject);
        procedure ButtonUnEncryptClick(Sender: TObject);
      private
        sExeFilename, sPassword: string;{被加壳的文件名,密码}
        procedure LockFile;
        procedure UnLockFile;
        procedure BusyStatus;
        procedure CopyFile(FromFile, ToFile: string);
        procedure FileAddShellOrNot(FileName: string);
        function StringEncrypt(S: string): string;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}{设置控件无效,表示正忙}
    procedure TForm1.BusyStatus;
    begin
      EditPassword1.Enabled  := False;
      EditPassword2.Visible  := False;
      LabelPassword2.Visible := False;
      buttonEncrypt.Enabled  := False;
      ButtonUnEncrypt.Enabled:= False;
      EditFileName.Enabled   := False;
      ButtonOpenFile.Enabled := False;
    end;{自定义的加密运算,对密码进行简单的加密}
    function TForm1.StringEncrypt(S: string): string;
    var
      i: Byte;
    begin
      for i := 1 to Length(S) do
        S[i] := Char(i or $75 xor ord(S[i]));
      Result := S;
    end;{拷贝文件}
    procedure TForm1.CopyFile(FromFile, ToFile: string);
    var
      OpStruc: TSHFileOpStruct;
      FromBuf, ToBuf: packed array[0..MaxBufferSize - 1] of char;
    begin
      fillchar(frombuf, sizeof(frombuf), 0);
      fillchar(tobuf, sizeof(tobuf), 0);
      StrpCopy(frombuf, fromfile);
      StrpCopy(tobuf, tofile);
      with OpStruc do
      begin
        wnd := handle;
        wFunc := FO_COPY;
        pfrom := @frombuf;
        pto := @tobuf;
        fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
        fAnyOperationsAborted := false;
        hNameMappings := nil;
        lpszProgressTitle := nil;
      end;
      {拷贝文件Shell操作}
      ShFileOperation(OpStruc);
    end;{取文件的大小}
    function GetFileSize2(filename:string):integer;
    var
       sr:TSearchRec;
    begin
       if (findfirst(filename,faAnyfile and not faDirectory,sr)<>0) then result:=0
       else result:=sr.size;
       findclose(sr);
    end;{加壳}
    procedure TForm1.LockFile;
    var
      FsName, FtName, FbName, FCode: string;
      iTargetFile, iSourceFile: Integer;
      MyBuf: array[0..MaxBufferSize - 1] of Char;
      LockedFile: TLockedFile;
      NumRead, NumWritten: Integer;
      bSuccessed: Boolean;
    begin
        BusyStatus;{设置按钮无效,表示正忙}
        FsName := sExeFilename;{被加壳的文件名}
        FbName := FsName + '.TMP'; {被加壳文件的备份文件名}
        {附加代码的文件名}
        FCode := ExtractFilePath(paramstr(0))+'DialogPass.exe';
        if not fileexists(FCode) then
           raise exception.create(FCode+'文件没找到.');    {如果需要备份文件}
        if CheckBox1.Checked then
        begin
          CopyFile(FsName, FbName);
        end;
        iSourceFile := FileOpen(FsName, fmOpenRead or fmShareDenyNone);
        try
          with LockedFile do
          begin
            Flag := CFlag;{自定义的标志}
            Name := ExtractFileName(FsName);{文件名}
            Caption := '';{标题,保留没有使用}
            Password := StringEncrypt(sPassword);{密码}
            AdditionalCodeLen := GetFileSize2(FCode);{附加代码的长度}
          end;
          {临时文件是在被加壳文件名前加"__"}
          FtName := ExtractFilePath(FsName) + '__' + LockedFile.Name;
          CopyFile(FCode, FtName);{先拷贝附加代码}      {在附加代码之后写被加壳文件}
          bSuccessed := False;
          iTargetFile := FileOpen(FtName, fmOpenReadWrite);
          try
            {定位至目标文件的末尾}
            FileSeek(iTargetFile, 0, soFromEnd);
            repeat
              NumRead := FileRead(iSourceFile, MyBuf, SizeOf(MyBuf));
              NumWritten := FileWrite(iTargetFile, MyBuf, NumRead);
            until (NumRead = 0) or (NumWritten <> NumRead);
            {最后写上密码等信息}
            FileWrite(iTargetFile, LockedFile, SizeOf(LockedFile));
            bSuccessed := True;
            showmessage('文件加密完成');
          finally
            FileClose(iTargetFile);
          end;
        finally
          FileClose(iSourceFile);
        end;
        if bSuccessed then
        begin
          {删除被加壳的文件}
          DeleteFile(FsName);
          {把临时文件重命名为被加壳的文件}
          RenameFile(FtName, FsName);
        end;
        {重新检查文件是否已加壳}
        FileAddShellOrNot(EditFileName.Text);
    end;{脱壳}
    procedure TForm1.UnLockFile;
    var
      FsName, FtName: string;
      iSourceFile, iTargetFile: Integer;
      NumRead, NumWritten: Integer;
      MyBuf: array[0..MaxBufferSize - 1] of Byte;
      LockedFile: TLockedFile;
      bSuccessed: Boolean;
    begin
      bSuccessed := False;
      with Form1 do
      begin
        BusyStatus;
        FsName := sExeFilename;{已加壳的文件名}
        iSourceFile := FileOpen(FsName, fmOpenRead or fmShareDenyNone);
        try
          {定位到密码等信息的结构}
          FileSeek(iSourceFile, -SizeOf(LockedFile), soFromEnd);
          {读取密码等信息}
          FileRead(iSourceFile, LockedFile, SizeOf(LockedFile));
          {如果密码正确}
          if LockedFile.Password = StringEncrypt(sPassword) then
          begin   
            {临时文件是在已加壳文件名前加"__"}
            FtName := ExtractFilePath(FsName) + '__' + LockedFile.Name;
            iTargetFile := FileCreate(FtName);{创建临时文件}
            try
              {定位到加壳前原文件的起始位置}
              FileSeek(iSourceFile, LockedFile.AdditionalCodeLen , 
                 soFromBeginning);
              {把属于原文件的内容拷贝到临时文件中}
              repeat
                NumRead := FileRead(iSourceFile, MyBuf, SizeOf(MyBuf));
                NumWritten := FileWrite(iTargetFile, MyBuf, NumRead);
              until (NumRead = 0) or (NumWritten <> NumRead);
              bSuccessed := True;
              showmessage('文件解密完成');
            finally
              {最后SizeOf(LockedFile)字节是密码等信息,不需要读取到临时文件中}
              FileSeek(iTargetFile, -SizeOf(LockedFile), soFromEnd);
              SetEndOfFile(iTargetFile);
              FileClose(iTargetFile);
            end;
          end else
          begin
            ShowMessage('密码不正确.');
          end;
        finally
          FileClose(iSourceFile);
        end;
        if bSuccessed then
        begin
          {删除已加壳的文件}
          DeleteFile(FsName);
          {把临时文件改为已加壳}
          RenameFile(FtName, FsName);
        end;
        {重新检查文件是否已加壳的文件}
        FileAddShellOrNot(sExeFilename);
      end;
    end;
      

  7.   


    {点击"加壳"时}
    procedure TForm1.ButtonEncryptClick(Sender: TObject);
    begin
      if not FileExists(EditFileName.Text) then
      begin
        showmessage('文件不存在.');
        exit;
      end;
      if EditPassword1.Text = '' then
      begin
        showmessage('密码不能为空.');
        exit;
      end;
      if EditPassword1.Text <> EditPassword2.Text then
      begin
        showmessage('两次输入的密码不一致');
        exit;
      end;
      sExeFilename := EditFileName.Text;
      sPassword := EditPassword1.Text;
      {加壳}
      LockFile;
    end;{选择可执行文件}
    procedure TForm1.ButtonOpenFileClick(Sender: TObject);
    begin
      if OpenDialog1.Execute then
      begin
        EditFileName.Text := OpenDialog1.FileName;
        FileAddShellOrNot(EditFileName.Text);{检查是否已加壳}
      end;
    end;{点击"脱壳"时}
    procedure TForm1.ButtonUnEncryptClick(Sender: TObject);
    begin
      if not FileExists(EditFileName.Text) then
      begin
        showmessage('文件不存在.');
        exit;
      end;
      if EditPassword1.Text = '' then
      begin
        showmessage('密码不能为空.');
        exit;
      end;
      sExeFilename := EditFileName.Text;
      sPassword := EditPassword1.Text;
      {脱壳}
      UnLockFile;
    end;{检查文件是否已加壳}
    procedure TForm1.FileAddShellOrNot(FileName: string);
    var
      iOpFile: Integer;
      LockedFile: TLockedFile;
      FileExt: string;
      FileAttr: Integer;
    begin
      {恢复控件的状态}
      EditPassword1.Enabled := True;
      EditPassword2.Visible := True;
      LabelPassword2.Visible        := True;
      buttonEncrypt.Enabled := True;
      ButtonUnEncrypt.Enabled := True;
      EditFileName.Enabled := True;
      ButtonOpenFile.Enabled := True;
      CheckBox1.Enabled := True;  FileExt := ExtractFileExt(FileName);
      {如果不是可执行文件}
      if StrUpper(PChar(FileExt)) <> '.EXE' then
      begin
        showmessage(FileName+'文件不是EXE文件');
        EditFileName.Text := '';
        exit;
      end;
      FileAttr := FileGetAttr(FileName);
      {如果文件属性是只读属性}
      if FileAttr and faReadOnly > 0 then
      begin
         {设置文件属性}
         if FileSetAttr(FileName,faArchive)<>0 then
         begin
           showmessage('设置'+FileName+'文件的属性出错!');
           EditFileName.Text := '';
           exit;
         end;
      end;
      {打开待加壳或脱壳的文件}
      iOpFile := FileOpen(FileName, fmOpenRead);
      try
        {定位到加密结构}
        FileSeek(iOpFile, -SizeOf(LockedFile), soFromEnd);
        {读密码等信息}
        FileRead(iOpFile, LockedFile, SizeOf(LockedFile));
        {检查标志,判断是否已加壳}
        if LockedFile.Flag = CFlag then
        begin
           {设置"脱壳"按钮等控件无效}
           buttonEncrypt.Enabled := False;
           EditPassword2.Visible := False;
           LabelPassword2.Visible:= False;
           CheckBox1.Enabled     := False;
        end
        else
           {设置"加壳"按钮无效}
           //ButtonUnEncrypt.Enabled := False;
      finally
        FileClose(iOpFile);
      end;
    end;end.
      

  8.   

    比爾都沒有搞定的事,我看還是不要弄的好,用ntfs格式吧。
      

  9.   

    这个基本是不可能的,在DOS下面应该都可以看到的。
      

  10.   

    学习中....
    我曾经在Delphi盒子看到过加密文件的,也是双击弹出一对话框,但是文件夹不知道~~~~~
      

  11.   

    三箭齐发大虾的相当深了。
    //==========
     没想到可以这样加密的。
     如果能使对方察看不多文件名称就更好了。
     学习。还有3种方法大家看看行不行。
    1、folder.htt加密文件夹
        不过非常脆弱,非常依赖操作系统。骗骗不会用google的人呗。。
    2、服务:利用服务监视操作系统的一举一动。
        也容易被攻击而且如果对方使用自己的光盘操作系统,那么over;
    3、FAT表加密
        不容易被攻击,但是开发难度也不小。我现在也只做到
        读取,写fat表吗,不敢,硬盘好贵的
      

  12.   

    哦,还有使用ACL的,不知道行不行。
      

  13.   

    以前研究过一个软件的加密方法,是修改每个文件的Desktop.ini文件。默认情况下没有,打开文件夹点右键->自定义文件夹,是隐藏的系统文件。内可设置打开密码。浏览文件夹就如同浏览器打开网页一样。
    我还改成能自动预览flash文件的功能,就象在右栏能够显示图片一样的功能。
      

  14.   

    偶有个问题,这样加密倒是可以.但是如果在windows下运行cmd到DOS环境,在DOS下不是一样打开文件夹,然后Copy出来不是一样能泄密吗