用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
Red_angelX的公告
<a href="http://www.cnblogs.com/Red_angelX/">新Blog:http://www.cnblogs.com/Red_angelX/</a> CSDN BLOG停用 <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> </script> <script type="text/javascript"> _uacct = "UA-842597-1"; urchinTracker(); </script>
文章分类
推荐网站
CodeProject
存档

原创  VC打造文件加密工具 收藏

          再实际生活中,不管是出于何种目的还是出于何种原因,总能希望自己的一些数据能够安全,不被第三方获取,或者被获取之后也让第三方无法解密.比如我工作的地方所有网络流量都被监控,再论坛上发个贴都能被网管看到,更别说传私人文件了,于是弄了个文件加密工具.
          加密原理很简单,给一个密码,对文件的每位和密码的每位进行异或,如此循环,解密方只要知道密码,就能解密出正确的文件.因为是自己用,所以加密算法就这么简单了,有高安全要求的可以把RSA,DES什么的全弄上去
          核心代码如下
// FileEncryptDlg.cpp : 实现文件
//

#include 
"stdafx.h"
#include 
"FileEncrypt.h"
#include 
"FileEncryptDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// 对话框数据
    enum { IDD = IDD_ABOUTBOX };

    
protected:
    
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    DECLARE_MESSAGE_MAP()
}
;

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}


void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CFileEncryptDlg 对话框




CFileEncryptDlg::CFileEncryptDlg(CWnd
* pParent /*=NULL*/)
    : CDialog(CFileEncryptDlg::IDD, pParent)
    , m_FilePath(_T(
""))
    , m_Key(_T(
""))
    , m_Dlg(NULL)
{
    m_hIcon 
= AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


void CFileEncryptDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_FILEPATH, m_FilePath);
}


BEGIN_MESSAGE_MAP(CFileEncryptDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    
//}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BROWER, &CFileEncryptDlg::OnBnClickedBrower)
    ON_BN_CLICKED(IDC_ENCRYPT, 
&CFileEncryptDlg::OnBnClickedEncrypt)
    ON_BN_CLICKED(IDC_DECRYPT, 
&CFileEncryptDlg::OnBnClickedDecrypt)
END_MESSAGE_MAP()


// CFileEncryptDlg 消息处理程序

BOOL CFileEncryptDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    
// 将“关于...”菜单项添加到系统菜单中。

    
// IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0== IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX 
< 0xF000);

    CMenu
* pSysMenu = GetSystemMenu(FALSE);
    
if (pSysMenu != NULL)
    
{
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        
if (!strAboutMenu.IsEmpty())
        
{
            pSysMenu
->AppendMenu(MF_SEPARATOR);
            pSysMenu
->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }

    }


    
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    
//  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    
// TODO: 在此添加额外的初始化代码

    
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


void CFileEncryptDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    
if ((nID & 0xFFF0== IDM_ABOUTBOX)
    
{
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }

    
else
    
{
        CDialog::OnSysCommand(nID, lParam);
    }

}


// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CFileEncryptDlg::OnPaint()
{
    
if (IsIconic())
    
{
        CPaintDC dc(
this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast
<WPARAM>(dc.GetSafeHdc()), 0);

        
// 使图标在工作矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        
int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(
&rect);
        
int x = (rect.Width() - cxIcon + 1/ 2;
        
int y = (rect.Height() - cyIcon + 1/ 2;

        
// 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }

    
else
    
{
        CDialog::OnPaint();
    }

}


//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CFileEncryptDlg::OnQueryDragIcon()
{
    
return static_cast<HCURSOR>(m_hIcon);
}



void CFileEncryptDlg::OnBnClickedBrower()
{
    
// TODO: 在此添加控件通知处理程序代码
    CFileDialog dlg(TRUE,"","",4|2,"所有文件(*.*)|*.*||",0,0);
    
if(dlg.DoModal() == IDOK)
    
{
        m_FilePath 
= dlg.GetPathName();
        UpdateData(FALSE);
    }

}


/*
 * 检测文件
 
*/

BOOL CFileEncryptDlg::XORFile()
{
    CFileFind fFind;
    
if(!fFind.FindFile(m_FilePath,0))
    
{
        AfxMessageBox(
"未找到文件",0,0);
        
return FALSE;
    }


    
//设置密码
    m_Dlg = new CKeyDlg;
    
if(m_Dlg->DoModal())
    
{
        m_Key 
= m_Dlg->m_Key==""?"red":m_Dlg->m_Key;
    }


    
//读文件
    CFile myFile(m_FilePath,CFile::modeRead);
    DWORD myFileLen 
= myFile.GetLength();
    BYTE
* fileBuffer = new BYTE[myFileLen];
    myFile.Read(fileBuffer,myFileLen);
    myFile.Close();
    
    
char* Key = m_Key.GetBuffer();
    
int KeyLen = sizeof(Key);

    
//加密
    for(int i=0;i<myFileLen;i++)
    
{
        fileBuffer[i] 
^= Key[i%KeyLen];           
    }


    
//保存
    CFile newFile(m_FilePath+".Enc",CFile::modeCreate | CFile::modeWrite);
    newFile.Write(fileBuffer,myFileLen);
    newFile.Close();

    
return TRUE;
}


void CFileEncryptDlg::OnBnClickedEncrypt()
{
    
// TODO: 在此添加控件通知处理程序代码
    if(XORFile())
        AfxMessageBox(
"加密完成",0,0);
}


void CFileEncryptDlg::OnBnClickedDecrypt()
{
    
// TODO: 在此添加控件通知处理程序代码
     if(XORFile())
        AfxMessageBox(
"解密完成",0,0);
}


        加密的强度是很低的,破解的方法麻,对于一个知道类型的文件,比如exe可以把固定的几个字符拿出来异或一下,这样,私有密钥就出来了

发表于 @ 2007年03月07日 10:54:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:正则表达式基础 | 新一篇:SDK编程获取硬盘序列号

  • 发表评论
  • 评论内容:
  •  
Copyright © Red_angelX
Powered by CSDN Blog