您的位置:首页 > 编程语言 > C语言/C++

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

2009-10-14 10:45 579 查看
核心代码如下:

#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 );
}


调用代码如下

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: