Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем? / 23 сообщений из 23, страница 1 из 1
17.06.2013, 12:16
    #38299733
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Требуется задодировать определенную текстовую строку с помощью алгоритма HMAC-SHA1 с определенным ключем.

Что нашёл:
1. http://www.sql.ru/forum/996651/hesh-funkciya-s-generiruemoy-solu-sha1?hl=sha1
Работает, но непонятно куда вставлять ключ.

2. http://stackoverflow.com/questions/12036611/system-security-cryptography-hmacsha1-is-com-visible-how-should-i-call-computeh
Код на vb.NET
Попытался перевести на VB6 - вот что у меня получилось:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Function HashString(ByVal StringToHash As String) As String

    Dim myEncoder As New System.Text.UTF32Encoding' Ошибка: User-defined type not type defined
    Dim Key() As Byte
    Key() = myEncoder.GetBytes("thisismykey")
    Dim Text() As Byte
    Text() = myEncoder.GetBytes(StringToHash)
    Dim myHMACSHA1 As New System.security.Cryptography.HMACSHA1
    myHMACSHA1 = System.security.Cryptography.HMACSHA1(Key)
    Dim HashCode As Byte
    HashCode() = myHMACSHA1.ComputeHash(Text)
    HashString = Convert.ToBase64String(HashCode)
End Function



Проблема: возникает ошибка при выполнении User-defined type not type defined
В качестве решения попытался скачать и зарегистрировать библиотеку mscorlib.dll, однако её не удалось прописать в референсах.

3. http://www.vbforums.com/attachment.php?attachmentid=87150&d=1325435014
Здесь тоже всё работает, но тоже не понятно, куда вставлять ключ.

Помогите кто чем может ))
...
Рейтинг: 0 / 0
17.06.2013, 12:30
    #38299760
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
1. Для начала прочитай в википедии, что такое hash и почему у него нет ключей.
2. System.security.Cryptography — c какого бодуна ты решил, что дотнетовские нэймспейсы вдруг объявятся в VB6?

решение
...
Рейтинг: 0 / 0
17.06.2013, 14:14
    #38300004
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Antonariy,

Вот уже час ломаю голову, как мне из всего этого собрать функцию, которая бы на входе получала бы текст + ключ - а на выходе HMAC-SHA1...


Код: 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.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
Private Const CP_UTF8 As Long = 65001

Private Const CALG_RC2                   As Long = &H6602&
Private Const CALG_MD5                   As Long = &H8003&
Private Const CALG_SHA1                  As Long = &H8004&
Private Const CALG_HMAC                  As Long = &H8009&

Private Const PROV_RSA_FULL              As Long = 1
Private Const PROV_RSA_AES               As Long = 24
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 Const HP_HMAC_INFO               As Long = 5

Private Const CRYPT_STRING_BASE64        As Long = &H1&
Private Const CRYPT_STRING_HEX           As Long = &H4&
Private Const CRYPT_STRING_HEXASCII      As Long = &H5&
Private Const CRYPT_STRING_HEXADDR       As Long = &HA&
Private Const CRYPT_STRING_HEXASCIIADDR  As Long = &HB&
Private Const CRYPT_STRING_HEXRAW        As Long = &HC&       'Requires Vista or later, so we emulate.
Private Const CRYPT_STRING_NOCR          As Long = &H80000000
Private Const CRYPT_STRING_NOCRLF        As Long = &H40000000 'Requires Vista or later!

Private Const CRYPT_IPSEC_HMAC_KEY       As Long = &H100&

Private Const PLAINTEXTKEYBLOB           As Byte = &H8
Private Const CUR_BLOB_VERSION           As Byte = &H2

Private Type HMAC_INFO
    HashAlgId As Long
    pbInnerString As Long
    cbInnerString As Long
    pbOuterString As Long
    cbOuterString As Long
End Type

Private Type BLOBHEADER
    bType As Byte
    bVersion As Byte
    reserved As Integer
    aiKeyAlg As Long
End Type

Private Type KEYBLOB
    hdr As BLOBHEADER
    cbKeySize As Long
    'rgbKeyData() As Byte 'We'll actually append this when we build the Byte array copy.
End Type

Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
        'Operating System     Value
        'Windows 3.1            3
        'Windows 95             4
        'Windows 98             4
        'Windows Me             4
        'Windows NT 3.51        3
        'Windows NT 4.0         4
        'Windows 2000           5
        'Windows XP             5
        'Windows .Net Server    5
        'Windows 2003 Server    5
        'Windows 2003 R2 Server 5
        'Windows Vista          6
        'Windows 2008 Server    6
    dwMinorVersion As Long
        'Operating System     Value
        'Windows 3.1            1
        'Windows 95             0
        'Windows 98             10
        'Windows Me             90
        'Windows NT 3.51        51
        'Windows NT 4.0         0
        'Windows 2000           0
        'Windows XP             1
        'Windows .Net Server    1
        'Windows 2003 Server    2
        'Windows 2003 R2 Server 2
        'Windows Vista          0
        'Windows 2008 Server    0
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
    
    'Extended information (optional), i.e. OSVERSIONINFOEX:
    wServicePackMajor As Integer
    wServicePackMinor As Integer
    wSuiteMask As Integer
    wProductType As Byte
        'Operating System     Value
        'NT Workstation         1
        'NT Domain Controller   2
        'NT Server              3
    wReserved As Byte
End Type

Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" ( _
    ByVal Destination As Long, _
    ByVal Source As Long, _
    ByVal Length As Long)

Private Declare Function GetVersionEx Lib "Kernel32" _
    Alias "GetVersionExA" ( _
    lpVersionInformation As OSVERSIONINFO) As Long

Private Declare Function MultiByteToWideChar Lib "Kernel32" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpMultiByteStr As Long, _
    ByVal cbMultiByte As Long, _
    ByVal lpWideCharStr As Long, _
    ByVal cchWideChar As Long) As Long

Private Declare Function WideCharToMultiByte Lib "Kernel32" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpWideCharStr As Long, _
    ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As Long, _
    ByVal cchMultiByte As Long, _
    ByVal lpDefaultChar As Long, _
    ByVal lpUsedDefaultChar As Long) As Long

Private Declare Function CryptAcquireContext Lib "Advapi32" Alias "CryptAcquireContextW" ( _
    ByRef phProv As Long, _
    ByVal pszContainer As Long, _
    ByVal pszProvider As Long, _
    ByVal dwProvType As Long, _
    ByVal dwFlags As Long) As Long

Private Declare Function CryptBinaryToString Lib "Crypt32" _
    Alias "CryptBinaryToStringW" ( _
    ByRef pbBinary As Byte, _
    ByVal cbBinary As Long, _
    ByVal dwFlags As Long, _
    ByVal pszString As Long, _
    ByRef pcchString As Long) As Long

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
    
Private Declare Function CryptDestroyHash Lib "Advapi32" ( _
    ByVal hHash As Long) As Long
    
Private Declare Function CryptDestroyKey Lib "Advapi32" ( _
    ByVal hKey As Long) As Long

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 CryptImportKey Lib "Advapi32" ( _
    ByVal hProv As Long, _
    ByVal pbData As Long, _
    ByVal dwDataLen As Long, _
    ByVal hPubKey As Long, _
    ByVal dwFlags As Long, _
    ByRef phKey As Long) As Long

Private Declare Function CryptReleaseContext Lib "Advapi32" ( _
    ByVal hProv As Long, _
    ByVal dwFlags As Long) As Long

Private Declare Function CryptSetHashParam Lib "Advapi32" ( _
    ByVal hHash As Long, _
    ByVal dwParam As Long, _
    ByRef pbData As HMAC_INFO, _
    ByVal dwFlags As Long) As Long

Private Declare Function CryptStringToBinary Lib "Crypt32" _
    Alias "CryptStringToBinaryW" ( _
    ByVal pszString As Long, _
    ByVal cchString As Long, _
    ByVal dwFlags As Long, _
    ByVal pbBinary As Long, _
    ByRef pcbBinary As Long, _
    ByRef pdwSkip As Long, _
    ByRef pdwFlags As Long) As Long

Private hBaseProvider As Long
Private hKey As Long
Private hHmacHash As Long
Private blnIsWinXP As Boolean
Private blnIsWin5_1 As Boolean 'XP or Windows 2003 Server.

Public Enum EncDecFormat
    edfBase64
    edfHex
    edfHexAscii
    edfHexAddr
    edfHexAsciiAddr
    edfHexRaw
End Enum
#If False Then 'Help preserve case of these names:
Dim edfBase64, edfHex, edfHexAscii, edfHexAddr, edfHexAsciiAddr, edfHexRaw
#End If

Public Enum EncodeFolding
    efCrLf
    efLf
    efNoFolding
End Enum
#If False Then 'Help preserve case of these names:
Dim efCrLf, efLf, efNoFolding
#End If

Public Function Decode( _
    ByVal Encoded As String, _
    Optional ByVal Format As EncDecFormat = edfHexRaw) As Byte()
    
    Dim dwFlags As Long
    Dim bytBuf() As Byte
    Dim lngOutLen As Long
    Dim dwActualUsed As Long
    
    Select Case Format
        Case edfBase64
            dwFlags = CRYPT_STRING_BASE64
        Case edfHex
            dwFlags = CRYPT_STRING_HEX
        Case edfHexAscii
            dwFlags = CRYPT_STRING_HEXASCII
        Case edfHexAddr
            dwFlags = CRYPT_STRING_HEXADDR
        Case edfHexAsciiAddr
            dwFlags = CRYPT_STRING_HEXASCIIADDR
        Case edfHexRaw
            dwFlags = CRYPT_STRING_HEXRAW
    End Select
    
    If blnIsWinXP And (Format = edfHexRaw) Then
        'Emulate missing format.
        Dim I As Long
        
        ReDim bytBuf(Len(Encoded) \ 2 - 1)
        For I = 1 To Len(Encoded) Step 2
            bytBuf((I - 1) \ 2) = CLng("&H0" & Mid$(Encoded, I, 2))
        Next
        Decode = bytBuf
    ElseIf CryptStringToBinary(StrPtr(Encoded), _
                              Len(Encoded), _
                              dwFlags, _
                              0, _
                              lngOutLen, _
                              0, _
                              dwActualUsed) = 0 Then
        Err.Raise vbObjectError Or &HD302&, _
                  "HS1.Decode", _
                  "Failed to determine decoded length, system error " _
                & CStr(Err.LastDllError)
    Else
        ReDim bytBuf(lngOutLen - 1)
        If CryptStringToBinary(StrPtr(Encoded), _
                               Len(Encoded), _
                               dwFlags, _
                               VarPtr(bytBuf(0)), _
                               lngOutLen, _
                               0, _
                               dwActualUsed) = 0 Then
            Err.Raise vbObjectError Or &HD304&, _
                      "HS1.Decode", _
                      "Failed to decode value, system error " _
                    & CStr(Err.LastDllError)
        Else
            Decode = bytBuf
        End If
    End If
End Function

Public Function Encode( _
    ByRef Bytes() As Byte, _
    Optional ByVal Format As EncDecFormat = edfHexRaw, _
    Optional ByVal Folding As EncodeFolding = efCrLf) As String
    
    Dim dwFlags As Long
    Dim lngOutLen As Long
    Dim strEncoded As String
    
    Select Case Format
        Case edfBase64
            dwFlags = CRYPT_STRING_BASE64
        Case edfHex
            dwFlags = CRYPT_STRING_HEX
        Case edfHexAscii
            dwFlags = CRYPT_STRING_HEXASCII
        Case edfHexAddr
            dwFlags = CRYPT_STRING_HEXADDR
        Case edfHexAsciiAddr
            dwFlags = CRYPT_STRING_HEXASCIIADDR
        Case edfHexRaw
            dwFlags = CRYPT_STRING_HEXRAW
    End Select
    
    Select Case Folding
        Case efNoFolding
            dwFlags = dwFlags Or CRYPT_STRING_NOCRLF
        Case efLf
            dwFlags = dwFlags Or CRYPT_STRING_NOCR
    End Select

    If blnIsWinXP And (Format = edfHexRaw) Then
        'Emulate missing format.
        Dim I As Long
        
        strEncoded = String$(2 * (UBound(Bytes) - LBound(Bytes) + 1), 0)
        For I = 1 To Len(strEncoded) Step 2
            Mid$(strEncoded, I, 2) = Right$("0" & Hex$(Bytes((I - 1) \ 2 + LBound(Bytes))), 2)
        Next
        Encode = strEncoded
    ElseIf CryptBinaryToString(Bytes(LBound(Bytes)), _
                               UBound(Bytes) - LBound(Bytes) + 1, _
                               dwFlags, _
                               0&, _
                               lngOutLen) = 0 Then
        Err.Raise vbObjectError Or &HC30A&, _
                  "HS256.Encode", _
                  "Failed to determine encoded length, system error " _
                & CStr(Err.LastDllError)
    Else
        strEncoded = String$(lngOutLen - 1, 0)
        If CryptBinaryToString(Bytes(LBound(Bytes)), _
                               UBound(Bytes) - LBound(Bytes) + 1, _
                               dwFlags, _
                               StrPtr(strEncoded), _
                               lngOutLen) = 0 Then
            Err.Raise vbObjectError Or &HC30C&, _
                      "HS256.Encode", _
                      "Failed to encode value, system error " _
                    & CStr(Err.LastDllError)
        Else
            If blnIsWin5_1 Then
                Select Case Folding
                    Case efNoFolding
                        Encode = Replace$(strEncoded, vbNewLine, "")
                    Case efLf
                        Encode = Replace$(strEncoded, vbCr, "")
                    Case Else
                        Encode = strEncoded
                End Select
            Else
                Encode = strEncoded
            End If
        End If
    End If
End Function

Public Function FromUTF8(ByRef UTF8() As Byte) As String
    Dim lngOutLen As Long
    Dim strWide As String
    
    lngOutLen = MultiByteToWideChar(CP_UTF8, _
                                    0, _
                                    VarPtr(UTF8(LBound(UTF8))), _
                                    UBound(UTF8) - LBound(UTF8) + 1, _
                                    0, _
                                    0)
    If lngOutLen = 0 Then
        Err.Raise vbObjectError Or &HD312&, _
                  "HS1.FromUTF8", _
                  "Failed to decode string, system error " _
                & CStr(Err.LastDllError)
    Else
        strWide = String$(lngOutLen, 0)
        lngOutLen = MultiByteToWideChar(CP_UTF8, _
                                        0, _
                                        VarPtr(UTF8(LBound(UTF8))), _
                                        UBound(UTF8) - LBound(UTF8) + 1, _
                                        StrPtr(strWide), _
                                        lngOutLen)
        If lngOutLen = 0 Then
            Err.Raise vbObjectError Or &HD312&, _
                      "HS1.FromUTF8", _
                      "Failed to decode string, system error " _
                    & CStr(Err.LastDllError)
        Else
            FromUTF8 = strWide
        End If
    End If
End Function

Public Function HmacSha1(ByRef Data() As Byte) As Byte()
    Dim lngErr As Long
    Dim HmacInfo As HMAC_INFO
    Dim lngDataLen As Long
    Dim lngHashSize As Long
    Dim bytHashValue() As Byte
    
    If hKey = 0 Then
        Err.Raise vbObjectError Or &HD322&, _
                  "HS1.HmacSha1", _
                  "No key set, call InitHmac first"
    ElseIf CryptCreateHash(hBaseProvider, CALG_HMAC, hKey, 0, hHmacHash) = 0 Then
        lngErr = Err.LastDllError
        DestroyHandles
        Err.Raise vbObjectError Or &HD32A&, _
                  "HS1.HmacSha1", _
                  "Failed to create HMAC hash object, system error " _
                & CStr(lngErr)
    Else
        HmacInfo.HashAlgId = CALG_SHA1
        If CryptSetHashParam(hHmacHash, HP_HMAC_INFO, HmacInfo, 0&) = 0 Then
            lngErr = Err.LastDllError
            DestroyHandles
            Err.Raise vbObjectError Or &HD32C&, _
                      "HS1.HmacSha1", _
                      "Failed to set HMAC_INFO hash param, system error " _
                    & CStr(lngErr)
        ElseIf CryptHashData(hHmacHash, _
                             Data(LBound(Data)), _
                             UBound(Data) - LBound(Data) + 1, _
                             0&) = 0 Then
            lngErr = Err.LastDllError
            DestroyHandles
            Err.Raise vbObjectError Or &HD32E&, _
                      "HS1.HmacSha1", _
                      "Failed to hash data, system error " _
                    & CStr(lngErr)
        Else
            lngDataLen = 4 '4 bytes for Long length.
            If CryptGetHashParam(hHmacHash, HP_HASHSIZE, lngHashSize, lngDataLen, 0&) = 0 Then
                lngErr = Err.LastDllError
                DestroyHandles
                Err.Raise vbObjectError Or &HD332&, _
                          "HS1.HmacSha1", _
                          "Failed to obtain hash value length, system error " _
                        & CStr(lngErr)
            Else
                lngDataLen = lngHashSize
                ReDim bytHashValue(lngDataLen - 1)
                If CryptGetHashParam(hHmacHash, HP_HASHVAL, bytHashValue(0), lngDataLen, 0&) = 0 Then
                    lngErr = Err.LastDllError
                    DestroyHandles
                    Err.Raise vbObjectError Or &HD334&, _
                              "HS1.HmacSha1", _
                              "Failed to obtain hash value, system error " _
                            & CStr(lngErr)
                Else
                    DestroyHandles
                    HmacSha1 = bytHashValue
                End If
            End If
        End If
    End If
End Function

Public Sub InitHmac(ByRef Key() As Byte)
    Dim hHash As Long
    Dim kbKey As KEYBLOB
    Dim bytKbKey() As Byte
    Dim lngErr As Long

    DestroyHandles
    If hBaseProvider = 0 Then
        Err.Raise vbObjectError Or &HD342&, _
                  "HS1.InitHmac", _
                  "No cryptographic Base provider context"
    Else
        With kbKey
            With .hdr
                .bType = PLAINTEXTKEYBLOB
                .bVersion = CUR_BLOB_VERSION
                .aiKeyAlg = CALG_RC2
            End With
            .cbKeySize = UBound(Key) - LBound(Key) + 1
            ReDim bytKbKey(LenB(kbKey) + .cbKeySize - 1)
            CopyMemory VarPtr(bytKbKey(0)), VarPtr(kbKey), LenB(kbKey)
            CopyMemory VarPtr(bytKbKey(LenB(kbKey))), VarPtr(Key(LBound(Key))), .cbKeySize
        End With
        If CryptImportKey(hBaseProvider, _
                          VarPtr(bytKbKey(0)), _
                          UBound(bytKbKey) + 1, _
                          0, _
                          CRYPT_IPSEC_HMAC_KEY, _
                          hKey) = 0 Then
            lngErr = Err.LastDllError
            DestroyHandles
            Err.Raise vbObjectError Or &HD344&, _
                      "HS1.InitHmac", _
                      "Failed to import key, system error " _
                    & CStr(lngErr)
        End If
    End If
End Sub

Public Function MD5(ByRef Data() As Byte) As Byte()
    Dim hHash As Long
    Dim lngDataLen As Long
    Dim lngHashSize As Long
    Dim bytHashValue() As Byte
    
    If hBaseProvider = 0 Then
        Err.Raise vbObjectError Or &HD352&, _
                  "HS1.MD5", _
                  "No cryptographic Base provider context"
    ElseIf CryptCreateHash(hBaseProvider, CALG_MD5, 0&, 0&, hHash) = 0 Then
        Err.Raise vbObjectError Or &HD354&, _
                  "HS1.MD5", _
                  "Failed to create CryptoAPI Hash object, system error " _
                & CStr(Err.LastDllError)
    ElseIf CryptHashData(hHash, _
                         Data(LBound(Data)), _
                         UBound(Data) - LBound(Data) + 1, _
                         0&) = 0 Then
        CryptDestroyHash hHash
        Err.Raise vbObjectError Or &HD356&, _
                  "HS1.MD5", _
                  "Failed to hash data, system error " _
                & CStr(Err.LastDllError)
    Else
        lngDataLen = 4 '4 bytes for Long length.
        If CryptGetHashParam(hHash, HP_HASHSIZE, lngHashSize, lngDataLen, 0&) = 0 Then
            CryptDestroyHash hHash
            Err.Raise vbObjectError Or &HD358&, _
                      "HS1.MD5", _
                      "Failed to obtain hash value length, system error " _
                    & CStr(Err.LastDllError)
        Else
            lngDataLen = lngHashSize
            ReDim bytHashValue(lngDataLen - 1)
            
            If CryptGetHashParam(hHash, HP_HASHVAL, bytHashValue(0), lngDataLen, 0&) = 0 Then
                CryptDestroyHash hHash
                Err.Raise vbObjectError Or &HD35A&, _
                          "HS1.MD5", _
                          "Failed to obtain hash value, system error " _
                        & CStr(Err.LastDllError)
            Else
                CryptDestroyHash hHash
                MD5 = bytHashValue
            End If
        End If
    End If
End Function

Public Function ToUTF8(ByVal Text As String) As Byte()
    Dim lngOutLen As Long
    Dim UTF8() As Byte
    
    lngOutLen = WideCharToMultiByte(CP_UTF8, 0, StrPtr(Text), Len(Text), _
                                    0, 0, 0, 0)
    ReDim UTF8(lngOutLen - 1)
    WideCharToMultiByte CP_UTF8, 0, StrPtr(Text), Len(Text), _
                        VarPtr(UTF8(0)), lngOutLen, 0, 0
    ToUTF8 = UTF8
End Function

Private Sub DestroyHandles(Optional ByVal Release As Boolean = False)
    On Error Resume Next 'Handle all exceptions here!
    If hHmacHash <> 0 Then CryptDestroyHash hHmacHash: hHmacHash = 0
    If hKey <> 0 Then CryptDestroyKey hKey: hKey = 0
    If Release And (hBaseProvider <> 0) Then CryptReleaseContext hBaseProvider, 0&: hBaseProvider = 0
    Err.Clear
End Sub

Private Sub Class_Initialize()
    Dim osvResult As OSVERSIONINFO
    
    With osvResult
        .dwOSVersionInfoSize = Len(osvResult)
        .szCSDVersion = ""
        If GetVersionEx(osvResult) = 0 Then
            Err.Raise vbObjectError Or &HD362&, _
                      "HS1.Class_Initialize", _
                      "Failed to obtain Windows version, system error " _
                    & CStr(Err.LastDllError)
        Else
            If .dwMajorVersion = 5 And .dwMinorVersion >= 1 Then
                blnIsWin5_1 = True 'XP or Win 2003 Server.
                If .wProductType = 1 Then
                    'XP 32 or 64 bit.
                    blnIsWinXP = True
                Else
                    'Win 2003 Server.
                End If
            ElseIf CCur(.dwMajorVersion) + CCur(.dwMinorVersion) / 1000@ >= 5.002@ Then
                'Vista or later.
            Else
                Err.Raise vbObjectError Or &HD364&, _
                          "HS1.Class_Initialize", _
                          "Requires Windows XP or later"
            End If
        End If
    End With
    If CryptAcquireContext(hBaseProvider, _
                           0&, _
                           StrPtr(MS_DEFAULT_PROVIDER), _
                           PROV_RSA_FULL, _
                           CRYPT_VERIFYCONTEXT) = 0 Then
        Err.Raise vbObjectError Or &HD366&, _
                  "HS1.Class_Initialize", _
                  "Failed to obtain CryptoAPI Base context, system error " _
                & CStr(Err.LastDllError)
    End If
End Sub

Private Sub Class_Terminate()
    DestroyHandles Release:=True
End Sub


...
Рейтинг: 0 / 0
17.06.2013, 14:27
    #38300046
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Обязательно функцию? В примере сначала вызывается InitHmac с передачей ключа, а потом кодирование. Если сильно надо, можно вызов этой функции воткнуть в Decode/Encode/HmacSha1, снабдив их соответствующим параметром.
...
Рейтинг: 0 / 0
17.06.2013, 16:42
    #38300365
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Antonariy,

Нет, функцию не обязательно.
Нужно что-нибудь, чтобы работало.
У меня почему-то получается. Как то там запутано всё...
...
Рейтинг: 0 / 0
17.06.2013, 16:54
    #38300378
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Там же пример есть, все ясно как божий день.
...
Рейтинг: 0 / 0
17.06.2013, 17:26
    #38300440
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Antonariy,

В примере данные задаются не в текстовом формате, а в шестнадцатиричном вроде бы. Вот я и не пойму что с ним делать.
...
Рейтинг: 0 / 0
17.06.2013, 17:34
    #38300453
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Там байтовый массив задается. Строку в байтовый массив можно перевести с помощью функции StrConv.
...
Рейтинг: 0 / 0
17.06.2013, 18:11
    #38300516
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Antonariy,

Не получается. Знаки вопроса выходят вместо символов.
Не могли бы Вы подсказать хотя бы немного код? А то играем в кошки /мышки..
...
Рейтинг: 0 / 0
17.06.2013, 18:11
    #38300518
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Код чего?
...
Рейтинг: 0 / 0
17.06.2013, 18:14
    #38300521
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Зачем мне писать какой-то код, который мне не интересен? Лучше покажи, что сам написал, а я скажу, где ошибка.
...
Рейтинг: 0 / 0
18.06.2013, 08:36
    #38300921
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
AntonariyЗачем мне писать какой-то код, который мне не интересен? Лучше покажи, что сам написал, а я скажу, где ошибка.

Для начала я хочу научиться получать из битовых данных "4869205468657265" строку "Hi There".

Судя по примеру это можно сделать через функцию Fold:
Код: vbnet
1.
MsgBox Fold("4869205468657265")


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Function Fold(ByVal S As String) As String
    With HS1
        S = .Encode(.Decode(S), edfHexAsciiAddr, efCrLf)
    End With
    S = vbTab & Replace$(S, vbNewLine, vbNewLine & vbTab)
    Fold = Left$(S, Len(S) - 1)
End Function



Как получить только текст я так и не разобрался.


Если же использовать функцию StrConv то у меня получаются вопросительные знаки только:
Код: vbnet
1.
MsgBox StrConv("4869205468657265", vbFromUnicode)



Где ошибка?
...
Рейтинг: 0 / 0
18.06.2013, 09:00
    #38300941
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
48 69 20 54 68 65 72 65 это hex-представление строки, а байтовый массив получается так:
Код: vbnet
1.
Dim b() As Byte = StrConv("Hi there", vbFromUnicode)

Естественно, с помощью MsgBox его не отобразишь.
...
Рейтинг: 0 / 0
18.06.2013, 09:29
    #38300984
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Antonariy,

Что теперь не так?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub Command2_Click()
Dim key() As Byte
Dim inText() As Byte
Dim result() As Byte

key = StrConv("Hi there", vbFromUnicode) 'Переводим ключ в байтовый массив
inText = StrConv("Jefe", vbFromUnicode) 'Переводим текст в байтовый массив

Call HS1.InitHmac(key) 'Производим инициализацию и задаем ключ
result = HS1.HmacSha1(inText) 'Получаем результат шифрования в виде байтового массива

MsgBox StrConv(result, vbUnicode) 'Переводим байтовый массив в строковое выражение


End Sub


...
Рейтинг: 0 / 0
18.06.2013, 09:39
    #38301000
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
donpaulsЧто теперь не так?MsgBox не умеет отображать строку в юникоде
...
Рейтинг: 0 / 0
18.06.2013, 09:53
    #38301023
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Shocker.ProdonpaulsЧто теперь не так?MsgBox не умеет отображать строку в юникоде

А как перевести строку в такой формат, который мог бы отображаться в msgbox?
...
Рейтинг: 0 / 0
18.06.2013, 10:15
    #38301062
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
А что ты хочешь увидеть в MsgBox? В результате шифрования получается байтовый массив, который не обязан выглядеть читаемо в виде текста.

Все нормально, как мне кажется.
...
Рейтинг: 0 / 0
18.06.2013, 11:11
    #38301168
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
AntonariyА что ты хочешь увидеть в MsgBox? В результате шифрования получается байтовый массив, который не обязан выглядеть читаемо в виде текста.

Все нормально, как мне кажется.

Дело в том, что мне же нужно с этим массивом как-то дальше работать..
Мне необходимо, цитирую:
автор2. Закодировать полученную в п.1 строку с использованием алгоритма HMAC-SHA1 с ключом SecretKey, полученным ранее при авторизации пользователя.
$encrypted = hash_hmac('sha1', $stringToSign, $secretKey, false);
Источник: http://help.megaplan.ru/API_authentication
...
Рейтинг: 0 / 0
18.06.2013, 11:22
    #38301189
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
donpaulsДело в том, что мне же нужно с этим массивом как-то дальше работать..Ты не умеешь работать с массивами или что? Тебе нужно было закодировать строку, ты ее закодировал. О том, что будет дальше, ты не говорил.
...
Рейтинг: 0 / 0
18.06.2013, 11:25
    #38301195
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
http://help.megaplan.ru/API_authentication 3. Закодировать полученное в п.2 значение алгоритмом MIME base64Найди реализацию base64, принимающую на вход байтовый массив.
...
Рейтинг: 0 / 0
18.06.2013, 14:16
    #38301620
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Antonariy http://help.megaplan.ru/API_authentication 3. Закодировать полученное в п.2 значение алгоритмом MIME base64Найди реализацию base64, принимающую на вход байтовый массив.

Можно ли сделать так?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Sub Command2_Click()
Dim key() As Byte
Dim inText() As Byte
Dim result() As Byte
Dim result2 as String
Dim result3 as String

key = StrConv("Hi there", vbFromUnicode) 'Переводим ключ в байтовый массив
inText = StrConv("Jefe", vbFromUnicode) 'Переводим текст в байтовый массив

Call HS1.InitHmac(key) 'Производим инициализацию и задаем ключ
result = HS1.HmacSha1(inText) 'Получаем результат шифрования в виде байтового массива

result2 = StrConv(result, vbUnicode) 'Переводим байтовый массив в строковое выражение

result3 = b64m(result2)

msgbox result3

End Sub




Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Function b64m(inputText As String) As String
    ' начиная с win xp присутствует com-server
    ' %ProgramFiles%\Common Files\Microsoft Shared\CAPICOM\CapiCom.dll
    '
    Dim CAPICOM As Object
    Dim b64$, what$
    
    Set CAPICOM = CreateObject("CAPICOM.Utilities")
    b64 = CAPICOM.Base64Encode(inputText)
    b64m = b64

    Set CAPICOM = Nothing
End Function
...
Рейтинг: 0 / 0
18.06.2013, 14:56
    #38301715
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Можно.
...
Рейтинг: 0 / 0
18.06.2013, 14:59
    #38301721
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем?
Вот только не присутствует CAPICOM в winXP, насколько мне известно. Ставил банк-клиент и цифровые подписи для электронной торговой площадки, и в обоих случаях без установки капикома, идущего в комплекте, софт не работал.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как закодировать строку с помощью алгоритма HMAC-SHA1 с ключем? / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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