先介紹一款小巧的hash工具,就是下圖這個,可以計算文件的md5值,SHA1值和CRC32值。不到100kb,功能也很簡單,就是對文件進行校驗,檢查是否被篡改過。
對于網上下載linux操作系統和windows操作系統,進行安裝的人會很方便,校驗后對比官方提供的校驗值??芍牢募欠癖淮鄹牧?,是否被添加了不明來源程序。
下面我們通過編程實現它,這個是界面。
這里只實現了md5校驗。
關鍵函數如下,線程中計算md5值。
UINT ThreadProc(LPVOID pParam)
{
b_IsRunning=1;
g_csThreadRunning.Lock();
CHashDlg *myHashDlg=(CHashDlg*)pParam;
int m_TotalFiles=myHashDlg->m_FileArray.GetCount();
myHashDlg->m_ProgressTotal.SetRange(0, m_TotalFiles);
for (int i=0; i < m_TotalFiles; i++)
{
MD5_CTX md5_ctx;
unsigned char decrypt[16];
char* m_binbuf;
ULONGLONG m_binlen;
CFile BinFile;
if (!BinFile.Open((LPCTSTR)(myHashDlg->m_FileArray.GetAt(i)), CFile::modeRead | CFile::typeBinary)) {
continue;
}
m_binlen=BinFile.GetLength();
int totalBlock=m_binlen / 102400 + 1;
myHashDlg->m_ProgressFile.SetRange(0, totalBlock);
m_binbuf=new char[1024000];
int totalread=0;
MD5Init(&md5_ctx);
for (;;) {
int readlen=BinFile.Read(m_binbuf, 1024000);
if (readlen <=0) {
break;
}
totalread +=readlen;
myHashDlg->m_ProgressFile.SetPos(totalread / 102400);
MD5Update(&md5_ctx, (PUCHAR)m_binbuf, readlen);
if (b_IsRunning !=1) {
break;
}
}
myHashDlg->m_ProgressFile.SetPos(totalBlock);
delete[] m_binbuf;
MD5Final(&md5_ctx, decrypt);
BinFile.Close();
myHashDlg->m_ProgressTotal.SetPos(i);
if (b_IsRunning !=1) {
break;
}
CString md5String;
for (int i=0; i < 16; i++)
{
//printf("%02x", decrypt[i]);
TCHAR szW[20];
_stprintf_s(szW, 20, _T("%02X"), decrypt[i]);
md5String.Append(szW);
}
CString strFileLen;
strFileLen.Format(_T("%lld bytes"), m_binlen);
myHashDlg->m_MD5Result +=_T("File: ");
myHashDlg->m_MD5Result +=myHashDlg->m_FileArray.GetAt(i);
myHashDlg->m_MD5Result +=_T("\r\n");
myHashDlg->m_MD5Result +=_T("Size: ");
myHashDlg->m_MD5Result +=strFileLen;
myHashDlg->m_MD5Result +=_T("\r\n");
myHashDlg->m_MD5Result +=md5String;
myHashDlg->m_MD5Result +=_T("\r\n");
myHashDlg->m_MD5Result +=_T("\r\n");
myHashDlg->SendMessage(WM_UPDATEMYDATA, FALSE);
}
myHashDlg->m_ProgressTotal.SetPos(m_TotalFiles);
g_csThreadRunning.Unlock();
return 0;
}
選擇文件函數,選擇后開始計算。
void CHashDlg::OnBnClickedButtonSelectFiles()
{
CFileDialog Dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT);
if (Dlg.DoModal()==IDOK)
{
b_IsRunning=0;
g_csThreadRunning.Lock();
m_FileArray.RemoveAll();
POSITION pos=Dlg.GetStartPosition();
while (pos)
{
m_FileArray.Add(Dlg.GetNextPathName(pos));
}
g_csThreadRunning.Unlock();
if (m_FileArray.GetCount() > 0) {
b_IsRunning=1;
CWinThread* pThread=AfxBeginThread(ThreadProc, this);
}
}
}
下面是md5算法實現文件
這是本號建立以來第一次發正經的內容,歡迎大家瀏覽評論。
工欲善其事必先利其器,作為計算機這一學科來說,c語言是我們大多初學者的入門之選,今天我給大家分享一款c語言的編程工具,vc++6.0。
下載完成后先解壓,然后打開文件夾,點擊安裝程序。VC6.0完整綠色版 中文.exe
在歡迎頁點擊下一步。
選擇自己想要安裝的位置,位置自己要記住。
點擊下一步,這里的創建快捷方式框可以不選(有人不習慣在桌面放好多圖標)
點擊安裝。
安裝完成后,先不要運行,因為win10系統可能會不兼容
選擇安裝文件夾里的MSDEV.EXE文件復制
粘貼到安裝目錄下\Common\MSDev98\Bin文件夾里,選擇替換
然后打開軟件,新建工程進行測試
輸出我們的入門程序hello world!
到這里我們的vc++6.0程序就算是安裝完成了。