purebasic.info

PureBasic forum
Текущее время: Пн ноя 19, 2018 12:45 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: HMAC-SHA512
СообщениеДобавлено: Чт апр 11, 2013 4:43 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вс янв 10, 2010 1:10 pm
Сообщений: 126
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Необходимо зашифровать строку с помощью алгоритма HMAC-SHA512.
В PHP это можно сделать с помощью:
Код:
1
hash_hmac("sha512", "my data", "secret_key");


Есть ли что нибудь подобное для пурика (userlib, asm-вставка, dll библиотека)?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 11, 2013 6:15 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6398
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Explode писал(а):
userlib

Валялась у меня, правда сам не пользовался


Вложения:
PB_SHA2.ZIP [118.63 KiB]
Скачиваний: 188

_________________
read-only ¯\_(ツ)_/¯
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 11, 2013 8:17 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вс янв 10, 2010 1:10 pm
Сообщений: 126
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Так это не HMAC(((
Нашел вот такую штуку:
http://msdn.microsoft.com/en-us/library ... 79(v=vs.85).aspx
Переписал на пурик и подправил под себя:
Код:
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
 
Structure HMAC_INFO
  HashAlgid.l
  pbInnerString.l
  cbInnerString.l
  pbOuterString.l
  cbOuterString.l
EndStructure
 
#PROV_RSA_AES = 24
#CRYPT_VERIFYCONTEXT = $F0000000
#CALG_SHA_512 = $0000800e
#CALG_HMAC = $00008009
#CALG_RC4 = $00006801
#HP_HMAC_INFO = $0005
#HP_HASHVAL = 2
 
Procedure.s HMAC_SHA512(DataString.s, PasswordString.s)
  HmacInfo.HMAC_INFO
  HmacInfo\HashAlgid = #CALG_SHA_512
  CryptAcquireContext_(@hProv, #Null, #Null, #PROV_RSA_AES, #CRYPT_VERIFYCONTEXT)
  CryptCreateHash_(hProv, #CALG_SHA_512, 0, 0, @hHash)
  CryptHashData_(hHash, @PasswordString, SizeOf(PasswordString), 0)
  CryptDeriveKey_(hProv, #CALG_RC4, hHash, 0, @hKey)
  CryptCreateHash_(hProv, #CALG_HMAC, hKey, 0, @hHMacHash)
  CryptSetHashParam_(hHMacHash, #HP_HMAC_INFO, @HmacInfo, 0)
  CryptHashData_(hHMacHash, @DataString, SizeOf(DataString), 0)
  CryptGetHashParam_(hHMacHash, #HP_HASHVAL, #Null, @dwDataLen, 0)
  pbHash = AllocateMemory(dwDataLen)
  CryptGetHashParam_(hHMacHash, #HP_HASHVAL, pbHash, @dwDataLen, 0)
  Hash.s = PeekS(pbHash)
  result.s = ""
  For i=1 To dwDataLen
    result = result + Right("0"+Hex(Asc(Mid(Hash,i,1))),2)
  Next i
  CryptDestroyHash_(hHMacHash)
  CryptDestroyKey_(hKey)
  CryptDestroyHash_(hHash)
  CryptReleaseContext_(hProv, 0)
  FreeMemory(pbHash)
  ProcedureReturn result
EndProcedure
 


И все бы хорошо, но при вызове процедуры...
Код:
1
Debug HMAC_SHA512("what do ya want for nothing?", "Jefe")


...она возвращает следующее:
Цитата:
21C63ECF874B18807F69E27311ED60605E0EA818A136C26F0B5C876A7F35A76CAB771718A86E29DBB30ABC0DE56D758F5A189EBFA273BCCA4C20F5FE541E2E36

А должна вот такую строку (http://www.einhugur.com/Html/EcryptIt/HMAC_SHA_512.html):
Цитата:
164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737

Видно где то я накосячил...помогите разобраться!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 11, 2013 9:30 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6398
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
А строку предварительно не надо в ANSI переводить?

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 11, 2013 10:21 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вс янв 10, 2010 1:10 pm
Сообщений: 126
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Уже пробовал...

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 11, 2013 3:25 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Отсюда взял Ключ и Текст
Explode писал(а):
А должна вот такую строку (http://www.einhugur.com/Html/EcryptIt/HMAC_SHA_512.html):
Цитата:
164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737

Код:
1
2
key = "Jefe"
data = "what do ya want for nothing?"



И подставил сюда
Explode писал(а):
Так это не HMAC(((
Нашел вот такую штуку:
http://msdn.microsoft.com/en-us/library ... 79(v=vs.85).aspx


Получилось
Код:
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
#include <stdio.h>; 
#include <windows.h>;
#include <wincrypt.h>;
 
int main()
{
//--------------------------------------------------------------------
// Declare variables.
//
// hProv:          Handle to a cryptographic service provider (CSP).
//                  This example retrieves the default provider for  
//                  the PROV_RSA_FULL provider type.  
// hHash:          Handle to the hash object needed to create a hash.
// hKey:           Handle to a symmetric key. This example creates a
//                  key for the RC4 algorithm.
// hHmacHash:      Handle to an HMAC hash.
// pbHash:         Pointer to the hash.
// dwDataLen:      Length, in bytes, of the hash.
// Data1:          Password string used to create a symmetric key.
// Data2:          Message string to be hashed.
// HmacInfo:       Instance of an HMAC_INFO structure that contains
//                  information about the HMAC hash.
//
HCRYPTPROV  hProv       = NULL;
HCRYPTHASH  hHash       = NULL;
HCRYPTKEY   hKey        = NULL;
HCRYPTHASH  hHmacHash   = NULL;
PBYTE       pbHash      = NULL;
DWORD       dwDataLen   = 0;
BYTE        Data1[]     = {0x4A,0x65,0x66,0x65};//Jefe
BYTE        Data2[]     = {0x77,0x68,0x61,0x74,0x20,0x64,0x6F,0x20,0x79,0x61,0x20,0x77,0x61,0x6E,0x74,0x20,0x66,0x6F,0x72,0x20,0x6E,0x6F,0x74,0x68,0x69,0x6E,0x67,0x3F};//what do ya want for nothing?
HMAC_INFO   HmacInfo;
 
//--------------------------------------------------------------------
// Zero the HMAC_INFO structure and use the SHA1 algorithm for
// hashing.
 
ZeroMemory(&HmacInfo, sizeof(HmacInfo));
HmacInfo.HashAlgid = CALG_SHA_512;
 
//--------------------------------------------------------------------
// Acquire a handle to the default RSA cryptographic service provider.
 
if (!CryptAcquireContext(
    &hProv,                   // handle of the CSP
    NULL,                     // key container name
    NULL,                     // CSP name
    PROV_RSA_AES,            // provider type
    CRYPT_VERIFYCONTEXT))     // no key access is requested
{
   printf(" Error in AcquireContext 0x%08x \n",
          GetLastError());
   goto ErrorExit;
}
 
//--------------------------------------------------------------------
// Derive a symmetric key from a hash object by performing the
// following steps:
//    1. Call CryptCreateHash to retrieve a handle to a hash object.
//    2. Call CryptHashData to add a text string (password) to the
//       hash object.
//    3. Call CryptDeriveKey to create the symmetric key from the
//       hashed password derived in step 2.
// You will use the key later to create an HMAC hash object.
 
if (!CryptCreateHash(
    hProv,                    // handle of the CSP
    CALG_SHA_512,                // hash algorithm to use
    0,                        // hash key
    0,                        // reserved
    &hHash))                  // address of hash object handle
{
   printf("Error in CryptCreateHash 0x%08x \n",
          GetLastError());
   goto ErrorExit;
}
 
if (!CryptHashData(
    hHash,                    // handle of the hash object
    Data1,                    // password to hash
    sizeof(Data1),            // number of bytes of data to add
    0))                       // flags
{
   printf("Error in CryptHashData 0x%08x \n",
          GetLastError());
   goto ErrorExit;
}
 
if (!CryptDeriveKey(
    hProv,                    // handle of the CSP
    CALG_RC4,                 // algorithm ID
    hHash,                    // handle to the hash object
    0,                        // flags
    &hKey))                   // address of the key handle
{
   printf("Error in CryptDeriveKey 0x%08x \n",
          GetLastError());
   goto ErrorExit;
}
 
//--------------------------------------------------------------------
// Create an HMAC by performing the following steps:
//    1. Call CryptCreateHash to create a hash object and retrieve
//       a handle to it.
//    2. Call CryptSetHashParam to set the instance of the HMAC_INFO
//       structure into the hash object.
//    3. Call CryptHashData to compute a hash of the message.
//    4. Call CryptGetHashParam to retrieve the size, in bytes, of
//       the hash.
//    5. Call malloc to allocate memory for the hash.
//    6. Call CryptGetHashParam again to retrieve the HMAC hash.
 
if (!CryptCreateHash(
    hProv,                    // handle of the CSP.
    CALG_HMAC,                // HMAC hash algorithm ID
    hKey,                     // key for the hash (see above)
    0,                        // reserved
    &hHmacHash))              // address of the hash handle
{
   printf("Error in CryptCreateHash 0x%08x \n",
          GetLastError());
   goto ErrorExit;
}
 
if (!CryptSetHashParam(
    hHmacHash,                // handle of the HMAC hash object
    HP_HMAC_INFO,             // setting an HMAC_INFO object
   (BYTE*)&HmacInfo,         // the HMAC_INFO object
    0))                       // reserved
{
   printf("Error in CryptSetHashParam 0x%08x \n",
          GetLastError());
   goto ErrorExit;
}
 
if (!CryptHashData(
    hHmacHash,                // handle of the HMAC hash object
    Data2,                    // message to hash
    sizeof(Data2),            // number of bytes of data to add
    0))                       // flags
{
   printf("Error in CryptHashData 0x%08x \n",
          GetLastError());
   goto ErrorExit;
}
 
//--------------------------------------------------------------------
// Call CryptGetHashParam twice. Call it the first time to retrieve
// the size, in bytes, of the hash. Allocate memory. Then call
// CryptGetHashParam again to retrieve the hash value.
 
if (!CryptGetHashParam(
    hHmacHash,                // handle of the HMAC hash object
    HP_HASHVAL,               // query on the hash value
    NULL,                     // filled on second call
    &dwDataLen,               // length, in bytes, of the hash
    0))
{
   printf("Error in CryptGetHashParam 0x%08x \n",
          GetLastError());
   goto ErrorExit;
}
 
pbHash = (BYTE*)malloc(dwDataLen);
if(NULL == pbHash)
{
   printf("unable to allocate memory\n");
   goto ErrorExit;
}
   
if (!CryptGetHashParam(
    hHmacHash,                 // handle of the HMAC hash object
    HP_HASHVAL,                // query on the hash value
    pbHash,                    // pointer to the HMAC hash value
    &dwDataLen,                // length, in bytes, of the hash
    0))
{
   printf("Error in CryptGetHashParam 0x%08x \n", GetLastError());
   goto ErrorExit;
}
 
// Print the hash to the console.
 
printf("The hash is:  ");
for(DWORD i = 0 ; i < dwDataLen ; i++)
{
   printf("%2.2x ",pbHash[i]);
}
printf("\n");
 
// Free resources.
ErrorExit:
    if(hHmacHash)
        CryptDestroyHash(hHmacHash);
    if(hKey)
        CryptDestroyKey(hKey);
    if(hHash)
        CryptDestroyHash(hHash);    
    if(hProv)
        CryptReleaseContext(hProv, 0);
    if(pbHash)
        free(pbHash);
    return 0;
 
 
 
 
}
 



На выходе всё равно не то что нужно
Изображение

Пароль и текст в LittleEndian
Код:
1
2
BYTE        Data1[]     = {0x65,0x66,0x65,0x4A};
BYTE        Data2[]     = {0x3F,0x67,0x6E,0x69,0x68,0x74,0x6F,0x6E,0x20,0x72,0x6F,0x66,0x20,0x74,0x6E,0x61,0x77,0x20,0x61,0x79,0x20,0x6F,0x64,0x20,0x74,0x61,0x68,0x77};


Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 12, 2013 4:22 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вс янв 10, 2010 1:10 pm
Сообщений: 126
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Вот блин...ладно, а если тогда поступить по другому - SHA512 взять из библиотеки, что предложил kvitaliy, а HMAC написать по примеру из вики.
Вот есть код на PHP:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
function hmac( $key, $data) {
    $b = 128;
    if (strlen($key) > $b) {
        $key = pack("H*",md5($key));
    }
    $key = str_pad($key, $b, chr(0x00));
    $ipad = str_pad('', $b, chr(0x36));
    $opad = str_pad('', $b, chr(0x5c));
    $k_ipad = $key ^ $ipad ;
    $k_opad = $key ^ $opad;
    return md5($k_opad . pack("H*",md5($k_ipad . $data)));
 }


Переделываем его под пурик:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
Procedure.s HMAC_SHA512(Message.s, Key.s)
  block_size.l = 128
  If Len(Key)>block_size
    Key = pack("*",SHA512(Key))
  EndIf
  Key = LSet(Key, block_size, Chr($00))
  IPad$ = LSet("", block_size, Chr($36))
  OPad$ = LSet("", block_size, Chr($5c))
  K_IPad$ = Key ^ IPad$
  K_OPad$ = Key ^ OPad$
  ProcedureReturn SHA512(K_OPad$+pack("H*",SHA512(K_IPad$+Message)))
EndProcedure


И теперь вопросы:
1. Что использовать вместо функции pack()
2. Как реализовать побитовое xor (циркумфлекс)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 12, 2013 4:59 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
Explode писал(а):
Как реализовать побитовое xor
:!:
Смайлик и есть ответ на вопрос.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 12, 2013 5:56 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вс янв 10, 2010 1:10 pm
Сообщений: 126
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Explode писал(а):
Как реализовать побитовое xor
:!:
Смайлик и есть ответ на вопрос.

Там на входе две строки. В пурике на такое ругается про синтаксис.
А вот с pack'ом я похоже разобрался.
Код:
1
2
3
4
5
6
7
Procedure.s _pack(String.s)
  Result.s = ""
  For i=1 To Len(String)
    Result+Chr(Val("$"+Mid(String,(i*2)-1,2)))
  Next i
  ProcedureReturn Result
EndProcedure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 12, 2013 6:11 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 16 раз.
Пункты репутации: 10
Explode писал(а):
Там на входе две строки.


    lakomet:Строка это что?

    Explode:Последовательность едениц и нулей.

    lakomet:Правильно. Значит что нужно хорить?

    Explode:Участки памяти содержащие эти еденички и нули.

    lakomet:Правильно. Садись пять.

    :D

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 12, 2013 7:00 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
lakomet, тебе четвёрка, а ему тройка :D . Русский совсем в школе не учили :D :D

lakomet писал(а):
lakomet:Строка - это что?

Explode:Последовательность единиц и нулей.

lakomet:Правильно. Значит, что нужно хорить?

Explode:Участки памяти, содержащие эти единички и нули.

lakomet:Правильно. Садись, пять.

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 12, 2013 7:01 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вс янв 10, 2010 1:10 pm
Сообщений: 126
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
lakomet писал(а):
Участки памяти содержащие эти еденички и нули.

Это как?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 12, 2013 7:06 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Explode писал(а):
Это как?
А так, что компьютер не понимает ничего, кроме нулей и единиц (кури двоичную систему исчисления). А про участки памяти - каждая строка размещается в памяти, и у каждой переменной есть адрес в памяти. Чтобы получить адрес переменной (это называется указатель, нужно перед её именем поставить @). Например:
Код:
1
2
3
a$ = "string"
Debug a$ ;Возвращаем строку
Debug @a$ ;Возвращаем указатель (адрес памяти) на строку


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 13, 2013 4:00 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вс янв 10, 2010 1:10 pm
Сообщений: 126
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
О великий учитель! Не удосужитесь ли вы представить мысль вашу в виде кода, дабы невежественный холоп смог лицезреть сие чудо!

Ну а если серьезно - нахрена мне хорить указатели?

P.S. Вот как вариант решения проблемы, но оно почему то на некоторых строках выдает неправильный результат:
Код:
1
2
3
4
  For i=1 To block_size
    K_IPad$+Chr(Asc(Mid(IPad$,i,1))!Asc(Mid(Key,i,1)))
    K_OPad$+Chr(Asc(Mid(OPad$,i,1))!Asc(Mid(Key,i,1)))
  Next i


_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 13, 2013 4:29 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 16 раз.
Пункты репутации: 10
Explode писал(а):
нахрена мне хорить указатели?

А кто говорил, что нужно хорить указатели? :shock:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
str1$ = "abc"
str2$ = "xwz"
 
len_str  = StringByteLength(str2$)
*res = AllocateMemory(len_str)
ShowMemoryViewer(*res,len_str)
CallDebugger
 
For i = 0 To len_str
  PokeB(*res + i,PeekB(@str1$ + i) ! PeekB(@str2$ + i))
Next i
 
ShowMemoryViewer(*res,len_str)
CallDebugger



Хотя если у тебя Ascii, можно сделать и черз Asc().

_________________
.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB