トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

ScrapCode/VB6/AdvApi32

INDEX

AdvApi32.DLL を使用したハッシュ値計算

DLLとしては、3DESとかAESとか暗号・復号処理も出来るけど試してない。

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
Option Explicit

Private Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" _
    (ByRef phProv As Long, ByVal pszContainer As String, ByVal pszProvider As String, _
     ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
Private Declare Function CryptReleaseContext Lib "advapi32.dll" _
    (ByVal hProv As Long, ByVal dwFlags As Long) As Long

Private Declare Function CryptCreateHash Lib "advapi32.dll" _
    (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.dll" _
    (ByVal hHash As Long) As Long
Private Declare Function CryptHashData Lib "advapi32.dll" _
    (ByVal hHash As Long, pbData As Any, ByVal cbData As Long, ByVal dwFlags As Long) As Long
Private Declare Function CryptGetHashParam Lib "advapi32.dll" _
    (ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, ByRef pcbData As Long, _
     ByVal dwFlags As Long) As Long

'Private Declare Function CryptDeriveKey Lib "advapi32.dll" _
'    (ByVal hProv As Long, ByVal Algid As Long, ByVal hBaseData As Long, ByVal dwFlags As Long, _
'     ByRef phKey As Long) As Long
'Private Declare Function CryptDestroyKey Lib "advapi32.dll" _
'    (ByVal hHash As Long) As Long
'Private Declare Function CryptEncrypt Lib "advapi32.dll" _
'Private Declare Function CryptDecrypt Lib "advapi32.dll" _

Private Const PROV_RSA_AES      As Long = 24
Private Const CRYPT_VERIFYCONTEXT   As Long = &HF0000000

Private Const HP_HASHVAL        As Long = 2

' Algorithm classes/types
Private Const ALG_CLASS_HASH    As Long = 32768
Private Const ALG_TYPE_ANY      As Long = 0

' Hash sub ids
Private Const ALG_SID_MD2       As Long = 1
Private Const ALG_SID_MD4       As Long = 2
Private Const ALG_SID_MD5       As Long = 3
Private Const ALG_SID_SHA       As Long = 4
Private Const ALG_SID_SHA_256   As Long = 12
Private Const ALG_SID_SHA_384   As Long = 13
Private Const ALG_SID_SHA_512   As Long = 14

' algorithm identifier definitions
Private Const CALG_MD2      As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD2)
Private Const CALG_MD4      As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD4)
Private Const CALG_MD5      As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5)
Private Const CALG_SHA      As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA)
Private Const CALG_SHA_256  As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA_256)
Private Const CALG_SHA_384  As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA_384)
Private Const CALG_SHA_512  As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA_512)

' SHA2-512 ハッシュ値計算
' ARG: 計算するデータのバイト配列
' RET: 計算されたハッシュ値のバイト配列
Public Function HashSHA512(abytData() As Byte) As Byte()
    Dim hProv As Long, hHash As Long
    Dim abytHash() As Byte
    Dim lngLength As Long
    
    If UBound(abytData()) - LBound(abytData()) < 0 Then
        GoTo ExitFunction
    End If
    
    If CryptAcquireContext(hProv, vbNullString, vbNullString, PROV_RSA_AES, CRYPT_VERIFYCONTEXT) = 0& Then
        GoTo ExitFunction
    End If
    
    If CryptCreateHash(hProv, CALG_SHA_512, 0&, 0&, hHash) = 0& Then
        GoTo CryptReleaseContext
    End If
    
    lngLength = UBound(abytData()) - LBound(abytData()) + 1
    If CryptHashData(hHash, abytData(LBound(abytData())), lngLength, 0&) = 0& Then
        GoTo CryptDestroyHash
    End If
    
    ReDim abytHash(63)
    lngLength = UBound(abytHash()) - LBound(abytHash()) + 1
    If CryptGetHashParam(hHash, HP_HASHVAL, abytHash(LBound(abytHash())), lngLength, 0&) <> 0& Then
        ReDim Preserve abytHash(lngLength - 1)
        HashSHA512 = abytHash
    End If

CryptDestroyHash:
    CryptDestroyHash hHash

CryptReleaseContext:
    CryptReleaseContext hProv, 0&

ExitFunction:

End Function

'Public Function CryptAES(abytData() As Byte, abytKey() As Byte) As Byte()
'End Function

最終更新時間:2016年12月04日 21時15分37秒 指摘や意見などあればSandBoxのBBSへ。