• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Tính mã MD5 cho tệp tin

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
Hình đại diện của người dùng
tuyen_dt18
Guru
Guru
Bài viết: 256
Ngày tham gia: T.Bảy 19/04/2008 8:46 pm
Đến từ: Hưng Yên
Been thanked: 43 time
Liên hệ:

Tính mã MD5 cho tệp tin

Gửi bàigửi bởi tuyen_dt18 » T.Bảy 03/08/2013 1:30 am

Tên bài viết: Tính mã MD5 cho tệp tin
Tác giả: tuyen_dt18
Cấp độ bài viết:
Tóm tắt: Tính mã MD5 cho tệp tin bằng ngôn ngữ VB6



1) Các bạn chạy VB6.EXE vào tạo 1 Project mới
2) Project gồm có :
+ 1 Form : Tên tùy ý
: Trên Form gồm có : + 2 TextBox có tên lần lượt là Text1, Text2
+ 1 Command Button với tên mặc định "Command1"
+ 1 Class : Tên cMD5

3) Chép code :
+ Chép code sau đây và dán vào phần code của Form:
  1. Private WithEvents MD5 As cMD5
  2.  
  3. Private Sub Command1_Click()
  4.     Set MD5 = New cMD5
  5.     Text2.Text = MD5.CalculateMD5sum(Text1.Text)
  6. End Sub
  7.  
  8. Private Sub MD5_Finish(ByVal bSuccess As Boolean)
  9.     Command1.Enabled = True
  10. End Sub
  11.  
  12. Private Sub MD5_InProgress(ByVal Percent As Integer)
  13.     Me.Caption = Percent & " %"
  14. End Sub
  15.  
  16. Private Sub MD5_Start()
  17.     Command1.Enabled = False
  18. End Sub
  19.  



+ Chép code sau và dán vào phần code của class :

  1. Option Explicit
  2.  
  3. Private Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextW" (ByVal phProv As Long, ByVal pszContainer As Long, ByVal pszProvider As Long, ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
  4. Private Declare Function CryptCreateHash Lib "advapi32.dll" (ByVal hProv As Long, ByVal Algid As Long, ByVal hKey As Long, ByVal dwFlags As Long, ByVal phHash As Long) As Long
  5. Private Declare Function CryptDestroyHash Lib "advapi32.dll" (ByVal hHash As Long) As Long
  6. Private Declare Function CryptHashData Lib "advapi32.dll" (ByVal hHash As Long, ByVal pbData As Long, ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long
  7. Private Declare Function CryptGetHashParam Lib "advapi32.dll" (ByVal hHash As Long, ByVal dwParam As Long, ByVal pByte As Long, ByVal pdwDataLen As Long, ByVal dwFlags As Long) As Long
  8. Private Declare Function CryptReleaseContext Lib "advapi32.dll" (ByVal hProv As Long, ByVal dwFlags As Long) As Long
  9. Private Declare Function GetLastError Lib "kernel32.dll" () As Long
  10. Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileW" (ByVal lpFileName As Long, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
  11. Private Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToRead As Long, ByVal lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
  12. Private Declare Function GetFileSize Lib "kernel32.dll" (ByVal hFile As Long, ByVal lpFileSizeHigh As Long) As Long
  13. Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
  14. Private Declare Function VirtualAlloc Lib "kernel32.dll" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
  15. Private Declare Function VirtualFree Lib "kernel32.dll" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
  16.  
  17. Private Const MS_ENHANCED_PROV As String = "Microsoft Enhanced Cryptographic Provider v1.0"
  18. Private Const PROV_RSA_FULL As Long = 1
  19. Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000
  20. Private Const NTE_EXISTS As Long = &H8009000F
  21. Private Const ALG_CLASS_HASH As Long = (4 * 2 ^ 13)
  22. Private Const ALG_TYPE_ANY As Long = 0
  23. Private Const ALG_SID_MD5 As Long = 3
  24. Private Const CALG_MD5 As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5)
  25. Private Const HP_HASHVAL As Long = &H2
  26. Private Const GENERIC_READ As Long = &H80000000
  27. Private Const FILE_SHARE_READ As Long = &H1
  28. Private Const OPEN_EXISTING As Long = 3
  29. Private Const INVALID_HANDLE_VALUE As Long = (-1)
  30. Private Const INVALID_FILE_SIZE As Long = &HFFFFFFFF
  31. Private Const MEM_RESERVE As Long = &H2000
  32. Private Const MEM_COMMIT As Long = &H1000
  33. Private Const MEM_RELEASE As Long = &H8000
  34. Private Const PAGE_READWRITE As Long = &H4
  35.  
  36. Private Type MD5Context
  37.     digest(0 To 15) As Byte
  38.     hHash As Long
  39. End Type
  40.  
  41. Public Event Start()
  42. Public Event InProgress(ByVal Percent As Integer)
  43. Public Event Finish(ByVal bSuccess As Boolean)
  44.  
  45. Public Function CalculateMD5sum(ByVal strFileName As String) As String
  46.     Const BufferSize As Long = &H200000 '2 MB
  47.    
  48.     Dim hFile As Long
  49.     Dim lngRead As Long
  50.     Dim lngFileSize As Long
  51.     Dim lngFileSizeHi As Long
  52.     Dim md5Hash As MD5Context
  53.     Dim hCryptProv As Long
  54.     Dim lpBuffer As Long
  55.     Dim lngCalculated As Long
  56.     Dim lngRemaining As Long
  57.     Dim lngBufferSize As Long
  58.    
  59.     RaiseEvent Start
  60.  
  61.     lngBufferSize = BufferSize
  62.     '
  63.    hFile = CreateFile(ByVal StrPtr(strFileName), GENERIC_READ, FILE_SHARE_READ, ByVal 0, OPEN_EXISTING, 0, ByVal 0)
  64.     If (hFile = INVALID_HANDLE_VALUE) Then
  65.         CalculateMD5sum = ""
  66.         RaiseEvent Finish(False)
  67.         Exit Function
  68.     End If
  69.     '
  70.    lngFileSize = GetFileSize(hFile, ByVal VarPtr(lngFileSizeHi))
  71.     If ((lngFileSize = INVALID_FILE_SIZE) Or (lngFileSize = 0)) Then
  72.         Call CloseHandle(hFile)
  73.         CalculateMD5sum = ""
  74.         RaiseEvent Finish(False)
  75.         Exit Function
  76.     End If
  77.     '
  78.    If (CryptStartup(hCryptProv) = False) Then
  79.         Call CloseHandle(hFile)
  80.         CalculateMD5sum = ""
  81.         RaiseEvent Finish(False)
  82.         Exit Function
  83.     End If
  84.     '
  85.    lpBuffer = VirtualAlloc(ByVal 0, lngBufferSize, MEM_COMMIT Or MEM_RESERVE, PAGE_READWRITE)
  86.     If (lpBuffer = 0) Then
  87.         Call CloseHandle(hFile)
  88.         CalculateMD5sum = ""
  89.         RaiseEvent Finish(False)
  90.         Exit Function
  91.     End If
  92.     '
  93.    Call MD5Init(md5Hash, hCryptProv)
  94.    
  95.     If (lngFileSize <= BufferSize) Then
  96.         lngBufferSize = lngFileSize
  97.         Call ReadFile(hFile, lpBuffer, lngBufferSize, ByVal VarPtr(lngRead), ByVal 0)
  98.         If (lngRead <> lngBufferSize) Then
  99.             Call VirtualFree(lpBuffer, ByVal 0, MEM_RELEASE)
  100.             Call CloseHandle(hFile)
  101.             Call CryptCleanup(hCryptProv)
  102.             CalculateMD5sum = ""
  103.             RaiseEvent Finish(False)
  104.             Exit Function
  105.         End If
  106.         '
  107.        Call MD5Update(md5Hash, lpBuffer, lngRead)
  108.         RaiseEvent InProgress(CInt(CSng(lngRead) / CSng(lngFileSize) * CSng(100)))
  109.     Else
  110.         lngRemaining = (lngFileSize - lngCalculated)
  111.         While (lngRemaining > 0)
  112.             If (lngRemaining < BufferSize) Then
  113.                 lngBufferSize = lngRemaining
  114.             Else
  115.                 lngBufferSize = BufferSize
  116.             End If
  117.             '
  118.            DoEvents
  119.             Call ReadFile(hFile, lpBuffer, lngBufferSize, ByVal VarPtr(lngRead), ByVal 0)
  120.             If (lngRead <> lngBufferSize) Then
  121.                 Call VirtualFree(lpBuffer, ByVal 0, MEM_RELEASE)
  122.                 Call CloseHandle(hFile)
  123.                 Call CryptCleanup(hCryptProv)
  124.                 CalculateMD5sum = ""
  125.                 RaiseEvent Finish(False)
  126.                 Exit Function
  127.             End If
  128.             '
  129.            Call MD5Update(md5Hash, lpBuffer, lngRead)
  130.             lngCalculated = lngCalculated + lngRead
  131.             lngRemaining = (lngFileSize - lngCalculated)
  132.             '
  133.            RaiseEvent InProgress(CInt(CSng(lngCalculated) / CSng(lngFileSize) * CSng(100)))
  134.         Wend
  135.     End If
  136.     '
  137.    Call MD5Final(md5Hash)
  138.     '
  139.  
  140.     Dim I As Integer
  141.     Dim B As Byte
  142.     Dim H As String
  143.     '
  144.    For I = 0 To 15
  145.         B = md5Hash.digest(I)
  146.         H = Hex$(B)
  147.         If (Len(H) < 2) Then
  148.             CalculateMD5sum = CalculateMD5sum & "0"
  149.         End If
  150.         CalculateMD5sum = CalculateMD5sum & H
  151.     Next I
  152.     '
  153.    Call CryptCleanup(hCryptProv)
  154.     Call VirtualFree(lpBuffer, ByVal 0, MEM_RELEASE)
  155.     Call CloseHandle(hFile)
  156.     '
  157.    RaiseEvent Finish(True)
  158. End Function
  159. '
  160. Private Function CryptStartup(ByRef m_hCryptProv As Long) As Boolean
  161.     If (CryptAcquireContext(ByVal VarPtr(m_hCryptProv), ByVal 0, ByVal StrPtr(MS_ENHANCED_PROV), PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) = 0) Then
  162.         If (GetLastError() = NTE_EXISTS) Then
  163.             If (CryptAcquireContext(ByVal VarPtr(m_hCryptProv), ByVal 0, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) = 0) Then
  164.                 CryptStartup = False
  165.                 Exit Function
  166.             End If
  167.         Else
  168.             CryptStartup = False
  169.             Exit Function
  170.         End If
  171.            
  172.     End If
  173.     CryptStartup = True
  174. End Function
  175.  
  176. Private Sub CryptCleanup(ByRef m_hCryptProv As Long)
  177.     If (m_hCryptProv <> 0) Then
  178.         Call CryptReleaseContext(m_hCryptProv, 0)
  179.     End If
  180.     m_hCryptProv = 0
  181. End Sub
  182.  
  183. Private Sub MD5Init(ByRef Ctx As MD5Context, ByVal m_hCryptProv As Long)
  184.     Call CryptCreateHash(m_hCryptProv, CALG_MD5, 0, 0, ByVal VarPtr(Ctx.hHash))
  185. End Sub
  186.  
  187.  
  188. Private Sub MD5Update(ByRef Ctx As MD5Context, ByVal lpBuffer As Long, ByVal dwLength As Long)
  189.     Call CryptHashData(ByVal Ctx.hHash, ByVal lpBuffer, dwLength, 0)
  190. End Sub
  191.  
  192. Private Sub MD5Final(ByRef Ctx As MD5Context)
  193.     Dim dwCount  As Long
  194.     dwCount = 16
  195.     Call CryptGetHashParam(ByVal Ctx.hHash, HP_HASHVAL, ByVal VarPtr(Ctx.digest(0)), ByVal VarPtr(dwCount), 0)
  196.     If (Ctx.hHash <> 0) Then
  197.         Call CryptDestroyHash(ByVal Ctx.hHash)
  198.     End If
  199.     Ctx.hHash = 0
  200. End Sub
  201.  
  202.  



4) Nhấn F5 để thử chương trình !

5) Khi chương trình đã chạy, nhập đường dẫn của một tệp tin trên máy tính của bạn vào Text1. Sau đó nhấn nút Calculate để xem mã MD5 của tệp tin đó.


Hỏi ý kiến tác giả trước khi sử dụng hoặc trích dẫn rõ nguồn bài viết khi sử dụng.

Hình đại diện của người dùng
NTN
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 472
Ngày tham gia: T.Tư 05/02/2014 3:43 pm
Đến từ: Cao Lãnh, Đồng Tháp,Việt Nam
Has thanked: 19 time
Been thanked: 7 time
Liên hệ:

Re: Tính mã MD5 cho tệp tin

Gửi bàigửi bởi NTN » T.Sáu 07/02/2014 6:54 pm

Bạn nói vậy mả MD5 nó đúng không ?

Hình đại diện của người dùng
NTN
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 472
Ngày tham gia: T.Tư 05/02/2014 3:43 pm
Đến từ: Cao Lãnh, Đồng Tháp,Việt Nam
Has thanked: 19 time
Been thanked: 7 time
Liên hệ:

Re: Tính mã MD5 cho tệp tin

Gửi bàigửi bởi NTN » T.Sáu 07/02/2014 7:05 pm

Đây là File tìm MD5 của các File như trên của bạn tuyen_dt18
Mình có thêm Label2 cho nó đẹp nhé !
Tập tin đính kèm
MD5.rar
Tập tin của bạn đây !
(26.67 KiB) Đã tải 199 lần


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách