vc++实现U盘介质加密解密保障存储安全

核心代码如下:

view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
#include "StdAfx.h"   
#include "Function.h"   
  
CString GetDiskNumber(CString name)   
{   
    HKEY hkey;   
    char sz[256];   
    DWORD dwtype,sl = 256;   
    int number=0;   
           
    // 确定选择的磁盘   
    for(int i=1;i<8;i++)   
    {   
        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",\   
            NULL,KEY_ALL_ACCESS,&hkey)==ERROR_SUCCESS)   
        {      
            CString id;   
            id.Format("%d",i);   
            if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)   
            {   
                CString str=(CString)sz;   
                if(str.Compare(name)==0)   
                {   
                    number=i;   
                    break;   
                }   
            }   
        }   
    }   
    CString driver="\\\\.\\PHYSICALDRIVE";   
    CString num;   
    num.Format("%d",number);   
    driver+=num;   
    return driver;   
}   
  
int ReadDisk(CString driver,unsigned char *Buf,long addr)   
{   
    HANDLE hDevice;   
    BOOL bResult;   
    DWORD bytesread;   
  
    hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,   
        FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);   
  
    if(hDevice==INVALID_HANDLE_VALUE)   
    {      
        AfxMessageBox("Error!");   
        return 0;   
    }   
  
    if(addr!=0)   
    {   
        SetFilePointer(hDevice,512*addr,NULL,NULL);   
    }   
       
    bResult=ReadFile(hDevice,Buf,512,&bytesread,NULL);   
  
    if((bResult==FALSE)||(bytesread<512))      
    {      
        AfxMessageBox("Error!");   
        return 0;   
    }   
  
    CloseHandle(hDevice);   
  
    return 1;   
}   
  
int WriteDisk(CString driver,unsigned char *Buf,long addr)   
{   
    HANDLE hDevice;   
    BOOL bResult;   
    DWORD bytesread;   
  
    hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,   
        FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);   
  
    if(hDevice==INVALID_HANDLE_VALUE)   
    {      
        AfxMessageBox("Error!");   
        return 0;   
    }   
  
    if(addr!=0)   
    {   
        SetFilePointer(hDevice,512*addr,NULL,NULL);   
    }   
       
    bResult=WriteFile(hDevice,Buf,512,&bytesread,NULL);   
  
    if((bResult==FALSE)||(bytesread<512))      
    {      
        AfxMessageBox("Error!");   
        return 0;   
    }   
  
    CloseHandle(hDevice);   
  
    return 1;   
}   
  
void PopupUSBDevice()   
{   
  char strSystemDirectory[256];   
  GetSystemDirectory( strSystemDirectory, 256 );   
  
  CString strTemp = strSystemDirectory;   
  strTemp += "\\rundll32.exe shell32.dll,Control_RunDLL hotplug.dll";   
  
  WinExec( strTemp, SW_SHOW );   
}  
#include "StdAfx.h"
#include "Function.h"

CString GetDiskNumber(CString name)
{
HKEY hkey;
    char sz[256];
    DWORD dwtype,sl = 256;
int number=0;
// 确定选择的磁盘
for(int i=1;i<8;i++)
{
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",\
NULL,KEY_ALL_ACCESS,&hkey)==ERROR_SUCCESS)
{
CString id;
id.Format("%d",i);
if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)
{
CString str=(CString)sz;
if(str.Compare(name)==0)
{
number=i;
break;
}
}
}
}
CString driver="\\\\.\\PHYSICALDRIVE";
CString num;
num.Format("%d",number);
driver+=num;
return driver;
}

int ReadDisk(CString driver,unsigned char *Buf,long addr)
{
HANDLE hDevice;
BOOL bResult;
DWORD bytesread;

hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

if(hDevice==INVALID_HANDLE_VALUE)
{   
AfxMessageBox("Error!");
return 0;
}

if(addr!=0)
{
SetFilePointer(hDevice,512*addr,NULL,NULL);
}
bResult=ReadFile(hDevice,Buf,512,&bytesread,NULL);

if((bResult==FALSE)||(bytesread<512))   
{   
AfxMessageBox("Error!");
return 0;
}

CloseHandle(hDevice);

return 1;
}

int WriteDisk(CString driver,unsigned char *Buf,long addr)
{
HANDLE hDevice;
BOOL bResult;
DWORD bytesread;

hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

if(hDevice==INVALID_HANDLE_VALUE)
{   
AfxMessageBox("Error!");
return 0;
}

if(addr!=0)
{
SetFilePointer(hDevice,512*addr,NULL,NULL);
}
bResult=WriteFile(hDevice,Buf,512,&bytesread,NULL);

if((bResult==FALSE)||(bytesread<512))   
{   
AfxMessageBox("Error!");
return 0;
}

CloseHandle(hDevice);

return 1;
}

void PopupUSBDevice()
{
  char strSystemDirectory[256];
  GetSystemDirectory( strSystemDirectory, 256 );

  CString strTemp = strSystemDirectory;
  strTemp += "\\rundll32.exe shell32.dll,Control_RunDLL hotplug.dll";

  WinExec( strTemp, SW_SHOW );

调用代码如下

view plaincopy to clipboardprint?
BOOL CMSSDlg::OnInitDialog()   
{   
    CDialog::OnInitDialog();   
  
    // Add "About..." menu item to system menu.   
  
    // IDM_ABOUTBOX must be in the system command range.   
    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);   
        }   
    }   
  
    // Set the icon for this dialog.  The framework does this automatically   
    //  when the application's main window is not a dialog   
    SetIcon(m_hIcon, TRUE);         // Set big icon   
    SetIcon(m_hIcon, FALSE);        // Set small icon   
       
    // TODO: Add extra initialization here   
    HKEY hkey;   
    char sz[256];   
    DWORD dwtype,sl = 256;   
  
    for(int i=1;i<8;i++)   
    {   
        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",\   
            NULL, KEY_ALL_ACCESS, &hkey)==ERROR_SUCCESS)   
        {   
            CString id;   
            id.Format("%d",i);   
            if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)   
            {   
                CString str=(CString)sz;   
                m_select.AddString(sz);   
            }   
        }   
    }   
    RegCloseKey(hkey);   
  
    m_select.SetCurSel(0);   
  
    if(m_select.GetCount()==0)   
    {   
        AfxMessageBox("没有发现移动设备!");   
    }   
    return TRUE;  // return TRUE  unless you set the focus to a control   
}   
  
void CMSSDlg::OnSysCommand(UINT nID, LPARAM lParam)   
{   
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)   
    {   
        CAboutDlg dlgAbout;   
        dlgAbout.DoModal();   
    }   
    else  
    {   
        CDialog::OnSysCommand(nID, lParam);   
    }   
}   
  
// If you add a minimize button to your dialog, you will need the code below   
//  to draw the icon.  For MFC applications using the document/view model,   
//  this is automatically done for you by the framework.   
  
void CMSSDlg::OnPaint()    
{   
    if (IsIconic())   
    {   
        CPaintDC dc(this); // device context for painting   
  
        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);   
  
        // Center icon in client rectangle   
        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;   
  
        // Draw the icon   
        dc.DrawIcon(x, y, m_hIcon);   
    }   
    else  
    {   
        CDialog::OnPaint();   
    }   
}   
  
// The system calls this to obtain the cursor to display while the user drags   
//  the minimized window.   
HCURSOR CMSSDlg::OnQueryDragIcon()   
{   
    return (HCURSOR) m_hIcon;   
}   
  
void CMSSDlg::OnExit()    
{   
    // TODO: Add your control notification handler code here   
    CMSSDlg::OnCancel();   
}   
  
LRESULT CMSSDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)   
{   
    if (WM_DEVICECHANGE == message)   
    {   
        m_select.ResetContent();   
  
        HKEY hkey;   
        char sz[256];   
        DWORD dwtype,sl = 256;   
  
        for(int i=1;i<8;i++)   
        {   
            if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",\   
                NULL,KEY_ALL_ACCESS,&hkey)==ERROR_SUCCESS)   
            {   
                CString id;   
                id.Format("%d",i);   
                if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)   
                {   
                    CString str=(CString)sz;   
                    m_select.AddString(sz);   
                }   
            }   
        }   
  
        m_select.SetCurSel(0);   
  
        RegCloseKey(hkey);   
    }   
  
    return CDialog::WindowProc(message, wParam, lParam);   
}   
  
void CMSSDlg::OnAddPassword()    
{   
    // TODO: Add your control notification handler code here   
    unsigned char MBRBuf[512];   
  
    CString name;   
    CString driver;   
           
    int id;             // 选择移动设备的编号   
  
    if(m_select.GetCurSel()==CB_ERR)   
    {   
        AfxMessageBox("请选择要加密的设备!");   
        return;   
    }   
  
    id=m_select.GetCurSel();   
    m_select.GetLBText(id,name);   
  
    // 确定选择的磁盘   
    driver=GetDiskNumber(name);   
  
    // 读磁盘的MBR区   
    if(ReadDisk(driver,MBRBuf,0)==0)   
        return;   
  
    /* RC4加密,KEY是密钥,此处Key[]="MobileStorageSecurity",后期可以  
     用户输入的密码作为密钥 */  
    RC4_KEY rc4_key;   
    build_rc4_key(Key,strlen((char*)Key),&rc4_key);   
    rc4_handler(MBRBuf,strlen((char*)MBRBuf),&rc4_key);   
  
    // 将加密后的MBR写入磁盘   
    if(WriteDisk(driver,MBRBuf,0)==0)   
        return;   
  
    AfxMessageBox("加密成功!");   
  
    // 弹出USB存储设备   
    PopupUSBDevice();   
}   
  
void CMSSDlg::OnRemovePassword()    
{   
    // TODO: Add your control notification handler code here   
    unsigned char MBRBuf[512];   
  
    CString name;   
    CString driver;   
           
    int id;             // 选择移动设备的编号   
  
    if(m_select.GetCurSel()==CB_ERR)   
    {   
        AfxMessageBox("请选择要加密的设备!");   
        return;   
    }   
  
    id=m_select.GetCurSel();   
    m_select.GetLBText(id,name);   
  
    // 确定选择的磁盘   
    driver=GetDiskNumber(name);   
  
    // 读磁盘的MBR区   
    if(ReadDisk(driver,MBRBuf,0)==0)   
        return;   
  
    /* RC4加密,KEY是密钥,此处Key[]="MobileStorageSecurity",后期可以  
     用户输入的密码作为密钥 */  
    RC4_KEY rc4_key;   
    build_rc4_key(Key,strlen((char*)Key),&rc4_key);   
    rc4_handler(MBRBuf,strlen((char*)MBRBuf),&rc4_key);   
  
    // 将解密后的MBR写入磁盘   
    if(WriteDisk(driver,MBRBuf,0)==0)   
        return;   
  
    AfxMessageBox("解密成功!");   
  
    // 弹出USB存储设备   
    PopupUSBDevice();   
}  
posted on 2010-05-30 22:03  carekee  阅读(1075)  评论(0编辑  收藏  举报