powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
11 сообщений из 11, страница 1 из 1
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500049
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жил да был вот такой код (AddLog -это я сейчас добавил)
Спер я его откуда-то "как есть", уже не помню, подозрений что что-то может быть не так не вызывал.
Нормально так жил, года 2 как с .Net-ом связался, проверял md5 файла загружаемой dll (в моем случае той, кот. отвечает за лицензии)
ну и если md5 неправильный, то пользователь идет лесом, то бишь ничего у него не работает,
типа доп. защита.
Но стали у некоторых клиентов возникать проблемы (оч. редко), грешил сначала на LoadLibrary и на глючность VM.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Imports System.Security.Cryptography
  Public Function GetMD5(ByVal filePath As String) As String
    AddLog("Starting GetMD5(ModFileName)")
    If IO.File.Exists(filePath) = False Then
      AddLog("The file " & filePath & "does not exist")
      AddLog("MD5=" & vbNullString)
      Return vbNullString
    End If
    Try
      Dim md5 As MD5CryptoServiceProvider = New MD5CryptoServiceProvider
      Dim f As IO.FileStream = _
       New IO.FileStream(filePath, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read, 8192)

      md5.ComputeHash(f)
      f.Close()

      Dim hash As Byte() = md5.Hash
      Dim buff As System.Text.StringBuilder = New System.Text.StringBuilder
      Dim hashByte As Byte

      For Each hashByte In hash
        buff.Append(String.Format("{0:X2}", hashByte))
      Next

      Dim md5string As String
      md5string = buff.ToString()

      AddLog("MD5=" & md5string)
      Return md5string
    Catch
      AddLog("GetMD5 Error " & Err.Number & "(" & Err.Description & ")")
      AddLog("MD5=" & vbNullString)
      Return vbNullString
    End Try
  End Function


Первого кастомера я послал с его виртуалкой 3 месяца назад,
второго послать не удалось
This is a physical machine, not virtual (Dell Precision T5810). ...The Windows 10 install is an OEM install from Dell with all Windows updates through June 2017.Короче сделал тест-проект с усиленным debug (типа того что в коде выше), послал кастомеру с проблемным компом.
Получил результат:
Код: vbnet
1.
2.
3.
8/3/2017 22:08:46   Starting GetMD5(ModFileName)
8/3/2017 22:08:46   GetMD5 Error 5(This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.)
8/3/2017 22:08:46   MD5=


Если по русски (воспроизвел уже на своем компе):
Код: vbnet
1.
04.08.2017 5:25:06   GetMD5 Error 5(Данная реализация не является частью протестированных криптографических алгоритмов Windows Platform FIPS.)



В общем "решение" я в итоге нагуглил довольно быстро.
Help to FIX: Error message ('This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.')

авторThe solution is:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy
Should be
Enabled = 0 (REG_DWORD)
If have Enabled = 1 then does not work.

Perhaps we should investigate the problem deeper and find another solution.
But currently Enabled = 0 should help.
( have reproduced the problem )

И че делать? Фиксить как-то надо.
Можно конечно в инсталлятор запихнуть правку реестра, но правка политик чужого компа это как-то ну очень грубо и неправильно.

Есть старое доброе API решение на VB6, но я его на .Net не переводил, не знаю даже вляпается оно в ту же проблему или нет.
Можно конечно попробовать, будет ли оно работать при воспроизведении проблемной ситуации с .Net кодом.
Но эту простыню на .Net переписывать еще задолбаешься:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
Option Explicit
'
'MD5Hash
'
'Perform CryptoAPI MD5 hash of contents of a named file or a Byte array,
'returning hash as String of 32 hex digits.

'----- Private Consts -----

Private Const ALG_TYPE_ANY          As Long = 0
Private Const ALG_CLASS_HASH        As Long = 32768
Private Const ALG_SID_MD5           As Long = 3
Private Const CALG_MD5              As Long = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5

Private Const PROV_RSA_FULL         As Long = 1
Private Const CRYPT_VERIFYCONTEXT   As Long = &HF0000000
Private Const MS_DEFAULT_PROVIDER   As String = _
    "Microsoft Base Cryptographic Provider v1.0"

Private Const HP_HASHVAL            As Long = 2
Private Const HP_HASHSIZE           As Long = 4
                  
'----- Private Defines -----

Private Declare Function CryptAcquireContext Lib "advapi32" Alias "CryptAcquireContextA" ( _
    ByRef phProv As Long, _
    ByVal pszContainer As String, _
    ByVal pszProvider As String, _
    ByVal dwProvType As Long, _
    ByVal dwFlags As Long) As Long 'TRUE (<> 0) = success.  See Err.LastDLLError if FALSE.

Private Declare Function CryptCreateHash Lib "advapi32" ( _
    ByVal hProv As Long, _
    ByVal algid As Long, _
    ByVal hKey As Long, _
    ByVal dwFlags As Long, _
    ByRef phHash As Long) As Long 'TRUE (<> 0) = success.  See Err.LastDLLError if FALSE.
    
Private Declare Function CryptDestroyHash Lib "advapi32" ( _
    ByVal hHash As Long) As Long 'TRUE (<> 0) = success.  See Err.LastDLLError if FALSE.

Private Declare Function CryptGetHashParam Lib "advapi32" ( _
    ByVal hHash As Long, _
    ByVal dwParam As Long, _
    ByRef pbData As Any, _
    ByRef pdwDataLen As Long, _
    ByVal dwFlags As Long) As Long

Private Declare Function CryptHashData Lib "advapi32" ( _
    ByVal hHash As Long, _
    ByRef pbData As Any, _
    ByVal dwDataLen As Long, _
    ByVal dwFlags As Long) As Long

Private Declare Function CryptReleaseContext Lib "advapi32" ( _
    ByVal hProv As Long, _
    ByVal dwFlags As Long) As Long 'TRUE (<> 0) = success.  See Err.LastDLLError if FALSE.

'----- Private Data -----

Private m_hHash As Long 'Hash object handle.
Private m_hProvider As Long 'Cryptographic Service Provider handle.

'----- Private Methods -----

Private Sub HashBlock(ByRef Block() As Byte)
    If CryptHashData(m_hHash, _
                     Block(LBound(Block)), _
                     UBound(Block) - LBound(Block) + 1, _
                     0&) = 0 Then
        Err.Raise vbObjectError Or &HC312&, _
                  "MD5Hash", _
                  "Failed to hash data block, system error " _
                & CStr(Err.LastDllError)
    End If
End Sub

Private Function HashValue() As String
    Dim lngDataLen As Long
    Dim lngHashSize As Long
    Dim bytHashValue() As Byte
    
    lngDataLen = 4 '4 bytes for Long length.
    If CryptGetHashParam(m_hHash, HP_HASHSIZE, lngHashSize, lngDataLen, 0&) = 0 Then
        Err.Raise vbObjectError Or &HC322&, _
                  "MD5Hash", _
                  "Failed to obtain hash value length, system error " _
                & CStr(Err.LastDllError)
    Else
        lngDataLen = lngHashSize
        ReDim bytHashValue(lngDataLen - 1)
        
        If CryptGetHashParam(m_hHash, HP_HASHVAL, bytHashValue(0), lngDataLen, 0&) = 0 Then
            Err.Raise vbObjectError Or &HC324&, _
                      "MD5Hash", _
                      "Failed to obtain hash value, system error " _
                    & CStr(Err.LastDllError)
        Else
            Dim intByte As Integer
            
            For intByte = 0 To lngDataLen - 1
                HashValue = HashValue & Right$("0" & Hex$(bytHashValue(intByte)), 2)
            Next
            
            CryptDestroyHash m_hHash
        End If
    End If
End Function

Private Sub NewHash()
    If CryptCreateHash(m_hProvider, CALG_MD5, 0&, 0&, m_hHash) = 0 Then
        Err.Raise vbObjectError Or &HC332&, _
                  "MD5Hash", _
                  "Failed to create CryptoAPI Hash object, system error " _
                & CStr(Err.LastDllError)
    End If
End Sub

'----- Public Methods -----

Public Function HashFile(ByVal FileName As String) As String
    Const CHUNK As Long = 16384
    Dim intFile As Integer
    Dim lngWholeChunks As Long
    Dim intRemainder As Integer
    Dim lngChunk As Long
    Dim bytBlock() As Byte
    
    On Error Resume Next 'Does file exist?
    GetAttr FileName
    If Err.NUMBER = 0 Then
        On Error GoTo 0
        intFile = FreeFile(0)
        Open FileName For Binary Access Read As #intFile
        lngWholeChunks = LOF(intFile) \ CHUNK
        intRemainder = LOF(intFile) - (CHUNK * lngWholeChunks)
        NewHash
        ReDim bytBlock(CHUNK - 1)
        For lngChunk = 1 To lngWholeChunks
            Get #intFile, , bytBlock
            HashBlock bytBlock
        Next
        If intRemainder > 0 Then
            ReDim bytBlock(intRemainder - 1)
            Get #intFile, , bytBlock
            HashBlock bytBlock
        End If
        Close #intFile
        HashFile = HashValue()
    Else
        Err.Raise vbObjectError Or &HC342&, _
                  "MD5Hash.HashFile", _
                  "File doesn't exist"
    End If
End Function

Public Function HashBytes(ByRef Block() As Byte) As String
    NewHash
    HashBlock Block
    HashBytes = HashValue()
End Function

'----- Class Event Handlers -----

Private Sub Class_Initialize()
    If CryptAcquireContext(m_hProvider, _
                           vbNullString, _
                           MS_DEFAULT_PROVIDER, _
                           PROV_RSA_FULL, _
                           CRYPT_VERIFYCONTEXT) = 0 Then
        Err.Raise vbObjectError Or &HC352&, _
                  "MD5Hash.Class_Initialize", _
                  "Failed to obtain access to CryptoAPI, system error " _
                & CStr(Err.LastDllError)
    End If
End Sub

Private Sub Class_Terminate()
    On Error Resume Next 'All exceptions must be processed here.
    CryptDestroyHash m_hHash
    CryptReleaseContext m_hProvider, 0&
End Sub

...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500052
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Можно конечно в инсталлятор запихнуть правку реестра, но правка политик чужого компа это как-то ну очень грубо и неправильно.
Еще как неправильно - скорее всего, у клиента на компьютере стоит какой-то крипто-софт, который требует этой политики/настройки реестра, без нее этот софт просто не будет работать. У нас такое было на компах с аутентификацией по е-токенам - аналогичная ошибка вылетала при попытке использовать RijndaelManaged, который не сертифицирован по FIPS - пришлось его менять на AesManaged. И да, при отключении FIPS-политики аутентификация работать перестала.
А в вашем случае я бы попробовал перекрыть FIPS-политику в конфиге программы: https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/enforcefipspolicy-element
...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500276
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныА в вашем случае я бы попробовал перекрыть FIPS-политику в конфиге программы: https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/enforcefipspolicy-element
Спасибо.
Ну вот смотри.
Вот так вот
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <runtime>
    <enforceFIPSPolicy enabled="false"/>
  </runtime>
</configuration>


Да, проблема решается, да вариант.

Но, я пока не отказался от поддержки XP и Win2003,
поэтому у меня поддерживается параллельная конфигурация под .Net 2.0 (дублированные exe-шники, устанавливаемые только на эти OS).
И вот такая конфигурация
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
    <supportedRuntime version="v2.0.50727"/>
      <runtime>
        <enforceFIPSPolicy enabled="false"/>
      </runtime>
    </startup>
</configuration>

к желаемому эффекту не приводит, т.е. не считает он md5.

Чисто теоретически, на XP такого ключа наверно нету, а вот на 2003-м сервере думаю быть может.
Конечно вероятность что 2003 сейчас, + включена политика (если она вообще там есть) крайне низка, но все же.

В доке на которую ты указал, в принципе ответ есть:
докаThis element was introduced in the .NET Framework 2.0 Service Pack 1.
У меня для всей проги на XP/2003 тоже требование именно .NET Framework 2.0 Service Pack 1 .
(Service Pack 1 мне там нужен для поддержки C++ рантайма)
Но VS2013 мне 2.0 SP1 не предлагает, только чистый 2.0,
поэтому .Net файлы для "xp/2003" у меня идут как Net 2.0 без SP
Естественно чего-то мудрить с этой устойчивой кухней за ради официально сдохшего XP/2003 (типа там требовать .Net 3.5 или .Net 4.0, или пытаться впихивать .Net2.0 SP1 в 13-ю студию на моем develop-компе Win10) я не буду и не хочу за ради этого.

Т.е. так понимаю вариант либо забить на это для файлов .Net2.0-версии (которые идут только на xp/2003),
либо полностью менять код.

Какие с этим варианты?

Счас кстати скомпилирую VB6 (API), и посмотрю вляпывается ли он в эту проблему при включенном FipsAlgorithmPolicy.
(спойлер в первом посте)
Если не вляпывается, то можно конечно переписать этот код на .Net (очевидно более устойчивое решение).
Но задолбаюсь с этими VB6 конструкциями типа Get #intFile, , bytBlock
...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500284
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Но, я пока не отказался от поддержки XP и Win2003,
поэтому у меня поддерживается параллельная конфигурация под .Net 2.0 (дублированные exe-шники, устанавливаемые только на эти OS).
И вот такая конфигурация
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
    <supportedRuntime version="v2.0.50727"/>
      <runtime>
        <enforceFIPSPolicy enabled="false"/>
      </runtime>
    </startup>
</configuration>

к желаемому эффекту не приводит, т.е. не считает он md5.
Все, сам дурак.
У меня ошибка в XML-е для .Net 2.0.
Вот так заработало:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v2.0.50727"/>
    </startup>
    <runtime>
        <enforceFIPSPolicy enabled="false"/>
    </runtime>
</configuration>


Тем более 2.0.50727, это кажется и есть SP1, "50727" - до боли знакомое любимое число по опыту борьбы с C++ рантаймами.
...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500308
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Счас кстати скомпилирую VB6 (API), и посмотрю вляпывается ли он в эту проблему при включенном FipsAlgorithmPolicy.
(спойлер в первом посте)
Если не вляпывается, то можно конечно переписать этот код на .Net (очевидно более устойчивое решение).
Но задолбаюсь с этими VB6 конструкциями типа Get #intFile, , bytBlock
А вот не вляпывается.
Чхать ему на эти "политики".

Так что даже не знаю, м.б. лучше и переписать на API от греха.
Формальной работы мне и так хватит, чтоб эту дрянь фиксить в двух прогах, даже через App.Config. "Новая версия" как минимум.
...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500325
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Так что даже не знаю, м.б. лучше и переписать на API от греха.
Посмотри в нугете, может там есть готовая библиотека расчета MD5.
MD5 достаточно простой алгоритм, исходников в инете полно. Поищи готовый. Может даже на VB.Net найдешь, в крайнем случае с другого ЯП перевести.
...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500326
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Надежный" API-код использует
Код: vbnet
1.
2.
Private Const MS_DEFAULT_PROVIDER   As String = _
    "Microsoft Base Cryptographic Provider v1.0"


"Ненадежный" .Net-код использует
Код: vbnet
1.
System.Security.Cryptography.MD5CryptoServiceProvider


Мож какой другой "провайдер" нужен?
Что в .Net инкапсулирует "Microsoft Base Cryptographic Provider v1.0"?
...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500341
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMD5 достаточно простой алгоритм, исходников в инете полно. Поищи готовый. Может даже на VB.Net найдешь
Ну вот нашел 2 года назад (код вверху первого поста).
Терерь огребаю, хорошо хоть не по полной.
Америкос задолбал 3 месяца назад. Лицензию купил, а воспользоваться не может, потому что я по MD5 отрубаю, а MD5 по найденной ныне причине не считается.
До сих пор переписываемся (пока установил "старую версию").
А счас второй "звоночек". Ну, думаю, надо решать проблему.
Dima T в крайнем случае с другого ЯП перевести.
100% рабочий код под спойлером внизу первого поста, но он VB6+API и труднопереводимый, там очень много чисто "VB6" конструкций.
...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500485
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMD5 достаточно простой алгоритм
И поэтому не особенно надежный. CLR для верифкации strong-named сборок использует SHA1 - имеет смысл попробовать его.
...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500503
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныDima TMD5 достаточно простой алгоритм
И поэтому не особенно надежный. CLR для верифкации strong-named сборок использует SHA1 - имеет смысл попробовать его.
Это у меня не защита программы, это защита от дурака.
Ну подменят dll, ну пусть даже подтасуют md5, воспроизведут API кот. она экспортирует (скоко работы то!).
Ну напишет GUI что есть лицензия, начинка то C-шная не заработает, она напрямую защищена.
Это в .Net приходится с dll-ми извращаться, протектор .Net-файлы не берет.
Смысла нет на что-то менять, итак имеем на практике "лучшее враг хорошего".
Dima T в крайнем случае с другого ЯП перевести.
100% рабочий код под спойлером внизу первого поста, но он VB6+API и труднопереводимый, там очень много чисто "VB6" конструкций.
Короче перевел я свой этот VB6 ->.Net,
хоть навыки какие-то вспомнил.
Работает без нареканий, от политик и App.config не зависит, наверно этот вариант оставлю.
Гляньте бегло, нет там подводных камней?
В принципе в случае ошибки (Return False, пустой md5), м.б. имеет смысл считать что dll прошла проверку. В этом коде, не в том который через реестр вышибается.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
    Dim str_md5 As String = ""
    Dim err_text As String = ""
    If GetMD5_API(ModFileName, str_md5, err_text) Then
      AddLog("MD5(API)=" & str_md5)
    Else
      AddLog("MD5(API) Failed. " & err_text)
    End If

..........................

Module ModuleMD5_API

  'Cryptography Functions

  'pszProvider - A null-terminated string that contains the name of the CSP to be used.
  Public Const MS_DEF_PROV As String = "Microsoft Base Cryptographic Provider v1.0"

  'dwProvType - Specifies the type of provider to acquire.
  Public Const PROV_RSA_FULL As Integer = 1

  'dwFlags - Flag values.
  Public Const CRYPT_VERIFYCONTEXT As Integer = &HF0000000

  Public Declare Unicode Function CryptAcquireContext Lib "advapi32" Alias "CryptAcquireContextW" ( _
   ByRef phProv As IntPtr, _
   ByVal pszContainer As String, _
   ByVal pszProvider As String, _
   ByVal dwProvType As Integer, _
   ByVal dwFlags As Integer) As Boolean

  'Algid - An ALG_ID value that identifies the hash algorithm to use.
  Public Const ALG_TYPE_ANY As Integer = 0
  Public Const ALG_CLASS_HASH As Integer = 32768
  Public Const ALG_SID_MD5 As Integer = 3
  Public Const CALG_MD5 As Integer = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5

  Public Declare Function CryptCreateHash Lib "advapi32" ( _
   ByVal hProv As IntPtr, _
   ByVal Algid As Integer, _
   ByVal hKey As IntPtr, _
   ByVal dwFlags As Integer, _
   ByRef phHash As IntPtr) As Boolean

  Public Declare Function CryptDestroyHash Lib "advapi32" ( _
   ByVal hHash As IntPtr) As Boolean

  'dwParam - Query type.
  Public Const HP_HASHVAL As Integer = 2
  Public Const HP_HASHSIZE As Integer = 4

  'использовать с HP_HASHSIZE
  Public Declare Function CryptGetHashParam Lib "advapi32" ( _
   ByVal hHash As IntPtr, _
   ByVal dwParam As Integer, _
   ByRef pbData As Integer, _
   ByRef pdwDataLen As Integer, _
   ByVal dwFlags As Integer) As Boolean
  'использовать с HP_HASHVAL
  Public Declare Function CryptGetHashParam Lib "advapi32" ( _
   ByVal hHash As IntPtr, _
   ByVal dwParam As Integer, _
   ByVal pbData As Byte(), _
   ByRef pdwDataLen As Integer, _
   ByVal dwFlags As Integer) As Boolean

  Public Declare Function CryptHashData Lib "advapi32" ( _
   ByVal hHash As IntPtr, _
   ByVal pbData As Byte(), _
   ByVal dwDataLen As Integer, _
   ByVal dwFlags As Integer) As Boolean
  Public Declare Function CryptReleaseContext Lib "advapi32" _
   (ByVal hProv As IntPtr, ByVal dwFlags As Integer) As Boolean

  Public Function GetMD5_API(ByVal filePath As String, ByRef str_md5 As String, ByRef err_text As String) As Boolean
    GetMD5_API = True
    If IO.File.Exists(filePath) = False Then
      GetMD5_API = False
      err_text = "Error. The specified file does not exist"
      Exit Function
    End If
    Dim m_hProvider As IntPtr 'Cryptographic Service Provider handle.
    If CryptAcquireContext(m_hProvider, vbNullString, _
     MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) = False Then
      GetMD5_API = False
      err_text = "CryptAcquireContext Error " & RaiseAPIError()
      GoTo ToExit
    End If

    Dim m_hHash As IntPtr 'Hash object handle.
    If CryptCreateHash(m_hProvider, CALG_MD5, IntPtr.Zero, 0, m_hHash) = False Then
      GetMD5_API = False
      err_text = "CryptCreateHash Error " & RaiseAPIError()
      GoTo ToExit
    End If

    Const CHUNK As Integer = 16384
    Dim lngWholeChunks As Long
    Dim intRemainder As Integer
    Dim bytBlock() As Byte

    Try
      Using f As IO.FileStream = _
       New IO.FileStream(filePath, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
        lngWholeChunks = f.Length \ CHUNK
        intRemainder = f.Length - (CHUNK * lngWholeChunks)

        ReDim bytBlock(CHUNK - 1)
        For lngChunk As Long = 1 To lngWholeChunks
          f.Read(bytBlock, 0, CHUNK)
          If CryptHashData(m_hHash, bytBlock, UBound(bytBlock) - LBound(bytBlock) + 1, 0) = False Then
            GetMD5_API = False 'но не выходим, пусть себе дальше пишет черт с ним
            err_text = "CryptHashData Error " & RaiseAPIError()
          End If
        Next
        If intRemainder > 0 Then
          ReDim bytBlock(intRemainder - 1)
          f.Read(bytBlock, 0, intRemainder)
          If CryptHashData(m_hHash, bytBlock, UBound(bytBlock) - LBound(bytBlock) + 1, 0) = False Then
            GetMD5_API = False 'но не выходим, пусть себе дальше пишет черт с ним
            err_text = "CryptHashData Error " & RaiseAPIError()
          End If
        End If
      End Using
    Catch
      GetMD5_API = False
      err_text = "Error " & Err.Number & "(" & Err.Description & ")"
      GoTo ToExit
    End Try

    Dim lngDataLen As Integer = 4 '4 bytes for Integer length.
    Dim lngHashSize As Integer
    If CryptGetHashParam(m_hHash, HP_HASHSIZE, lngHashSize, lngDataLen, 0) = False Then
      GetMD5_API = False
      err_text = "CryptGetHashParam Error " & RaiseAPIError()
      GoTo ToExit
    End If

    Dim bytHashValue() As Byte
    lngDataLen = lngHashSize
    ReDim bytHashValue(lngDataLen - 1)
    If CryptGetHashParam(m_hHash, HP_HASHVAL, bytHashValue, lngDataLen, 0) = False Then
      GetMD5_API = False
      err_text = "CryptGetHashParam Error " & RaiseAPIError()
      GoTo ToExit
    End If

    Try
      Dim buff As System.Text.StringBuilder = New System.Text.StringBuilder
      For Each hashByte As Byte In bytHashValue
        buff.Append(String.Format("{0:X2}", hashByte))
      Next
      str_md5 = buff.ToString()
    Catch
      GetMD5_API = False
      err_text = "Error " & Err.Number & "(" & Err.Description & ")"
      GoTo ToExit
    End Try

ToExit:
    If m_hHash <> IntPtr.Zero Then CryptDestroyHash(m_hHash)
    If m_hProvider <> IntPtr.Zero Then CryptReleaseContext(m_hProvider, 0)
  End Function


End Module



Хотя сдается мне, что и через System.Security.Cryptography сделать можно (без запретов в App.config).
"Провайдера" только какого-то другого надо, не MD5CryptoServiceProvider, со словом RSA чего-нибудь.
...
Рейтинг: 0 / 0
md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
    #39500530
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Гляньте бегло, нет там подводных камней?
Понятия не имею. VB не знаю. C WinAPI тоже так глубоко не дружу.

Я другое имел ввиду: Чистый расчет MD5 , т.е. берем байты и считаем их MD5, без всяких API и т.д. и т.п.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / md5 файла Err:This implementation is not part of the Windows Platform FIPS validated...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]