powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / MD5 и PB10.5
19 сообщений из 19, страница 1 из 1
MD5 и PB10.5
    #36167774
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой пример .
Скорректировал его под "PB10 is Unicode" (практически только функции Asc ->AscA и Len -> LenA), но работает как-то странно.
Если в тексте менять одну букву, то шифр остается без изменения.
Если в текст добавить или удалить букву, то шифр меняется.
Т.е. тесты типа (MD5-хеши) :
Код: plaintext
1.
2.
3.
4.
MD5("") = d41d8cd98f00b204e9800998ecf8427e  //ОК
MD5("md5") = 1bc29b36f623ba82aaf6724fd3b16718  //другое
MD5("md4") =  c93d3bf7a7c4afe94b64e30c2ce39f4f  //другое
Выдает MD5("md5") = MD5("md4") = другое

Это так надо? Или в скрипте надо что-то ещё подправить?
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36171123
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таки наверное, что что-то в скрипте
, т.к. на тестовой Web-страничке показало везде так как и должно.
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36176872
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SingleLineEdit задаю текст и использую его в качестве аргумента "as_text" при вызове функции of_MD5:

Код: plaintext
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.
// of_MD5
/*FUNCTION Boolean CryptAcquireContextA (ref ulong hProv, &
      ref string pszContainer, &
      ref string pszProvider, ulong dwProvType, &
      ulong dwFlags) &
    LIBRARY "advapi32.dll"

 FUNCTION Boolean CryptReleaseContext (ulong hProv, ulong dwFlags) &
    LIBRARY "advapi32.dll"

 FUNCTION Boolean CryptCreateHash (ulong hProv, uint Algid, ulong hKey, &
      ulong dwFlags, ref ulong phHash) &
    LIBRARY "advapi32.dll"

 FUNCTION Boolean CryptHashData (ulong hHash,  ref string pbData, &
      ulong dwDataLen, ulong dwFlags) &
    LIBRARY "advapi32.dll"

 FUNCTION Boolean CryptDestroyHash (ulong hHash) &
    LIBRARY "advapi32.dll"

 FUNCTION Boolean CryptGetHashParam (ulong hHash, ulong dwParam, &
     ref blob pbData, &
     ref ulong pdwDataLen, ulong dwFlags) &
    LIBRARY "advapi32.dll"

 FUNCTION Ulong GetLastError () Library "kernel32.dll"
*/
CONSTANT ULONG CALG_MD5 =  32771 
CONSTANT ULONG PROV_RSA_FULL =  1 
CONSTANT ULONG HP_HASHVAL =  2 
CONSTANT ULONG CRYPT_VERIFYCONTEXT =  4026531840 
ulong 		MD5LEN =  16 
ulong 		cbHash
ulong 		hProv 	// provider handle
ulong 		hHash	 	// hash object handle
ulong 		err_number
String		s_result, s_null
Integer		i, l, r, b
Blob{ 16 }	bl_hash
Blob{ 1 } 	bl_byte

SetNull (s_null)
CHAR 	HexDigits[ 0  TO  15 ] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}

/*Get handle to the crypto provider*/
IF NOT CryptAcquireContextA( hProv, s_null, s_null, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) THEN
  	err_number = GetLastError() 
  	return 'acquire context failed ' + String( err_number)
END IF

/*Create the hash object*/
IF NOT CryptCreateHash( hProv, CALG_MD5,  0 ,  0 , hHash) THEN
  	err_number = GetLastError()
  	CryptReleaseContext( hProv,  0 ) 
  	return 'create hash failed ' + String( err_number)
END IF

/*Add the input to the hash*/
/*IF NOT CryptHashData( hHash, as_text, Len( as_text), 0) THEN		//PB8-9*/
IF NOT CryptHashData( hHash, as_text, LenA( as_text),  0 ) THEN		/*PB10*/
	err_number = GetLastError()
  	CryptDestroyHash( hHash)
  	CryptReleaseContext( hProv,  0 ) 
  	return 'hashdata failed ' + String( err_number)
END IF

/*Get the hash value and convert it to readable characters*/
cbHash = MD5LEN
IF CryptGetHashParam( hHash, HP_HASHVAL, bl_hash, cbHash,  0 ) THEN
	  FOR i =  1  TO  16 
			bl_byte = BlobMid ( bl_hash, i,  1 )
		 /*b = Asc (String( bl_byte))	//PB8-9	*/	 
		 b = AscA( String( bl_byte, EncodingANSI!))	/*PB10*/
		 r = Mod( b,  16 ) 	/*right 4 bits*/
		 l = int( b /  16 )      	/* left 4 bits*/
		 s_result += HexDigits [l] + HexDigits [r]
	  NEXT
ELSE
  	err_number = GetLastError()
  	s_result = 'gethashparam failed ' + String( err_number)
END IF

/*clean up and return*/
CryptDestroyHash( hHash)
CryptReleaseContext( hProv,  0 )

return s_result

Чтобы не ввёл, результат отличается от тестового .
Причем ещё и результат не меняется при замене в тексте SingleLineEdit одного символа, а только при изменении длины текста.
Что сделано не так? Где ошибка?
Код: plaintext
1.
2.
3.
4.
/*У меня выдает:*/
MD5("") = d41d8cd98f00b204e9800998ecf8427e  //совпадает
MD5("md5") = 8972340305B0D53BA4492AC367424F3E
MD5("md4") = 8972340305B0D53BA4492AC367424F3E
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36177045
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISЧто сделано не так? Где ошибка?
Как минимум CryptAcquireContextA неверно объявлена.
Замените на CryptAcquireContextW, если не поможет будем разбираться дальше.
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36177127
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем концептуально ваша проблема заключается в следующем.
CryptHashData работает с блобом (массивом байт).
Когда вы передаете "", то и в ANSI и Unicode это один и тот же массив байт длиной 0 байт, и хеш у них одинаковый.
Если же вы передаете что-то отличное от "", то в ANSI и в Unicode это разные наборы байт. Поэтому тестовые строки дают разные результаты, т.к. у вас Unicode, а на сайте приведены результаты для ANSI строк.

Плюс накладывается неправильное использование ф-и. Вы передаете строку в Unicode, а длину в ANSI которая в 2 раза меньше (в байтах).

Тут есть несколько вариантов действий.
Во-первых можно исправить вызов на
Код: plaintext
CryptHashData( hHash, as_text, Len(as_text)* 2 ),  0 )// хотя правильнее Len(Blob(as_text)), но медленнее
В этом случае хеш будет считаться правильно, но отличаться от контрольных значений.

Во-вторых можно хешировать предварительно преобразовав в ANSI
Код: plaintext
CryptHashData( hHash, ToAnsi(as_text), LenA(as_text),  0 ) // и в декларации blob вместо string
В этом случае хеш будет совпадать с контрольными значениями.

ЗЫ. Предыдущее сообщение остается в силе.

ЗЗЫ. И перестаньте гадать, а то почитал ваш код и прослезился :)
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36177823
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky ,
в целом направление мысли (ANSI и/или Unicode) правильное, я в эту сторону и копал, вот только не получалось. Спасибо за подсказку.

А по поводу кода:
>> ЗЗЫ. И перестаньте гадать, а то почитал ваш код и прослезился :)
так он не мой, я в самом начале на него ссылку дал. Был и другой похожий вариант. И оба вроде бы рабочие под РВ10, но по факту у меня ни один не заработал. :(

Да и ладно, интересно другое:
- если сейчас перейти по той же ссылке , то можно увидеть добавленное исправление для версии РВ10.5.
Код: plaintext
1.
2.
3.
4.
5.
...
  // Add the input to the hash
  Blob bl_text
  bl_text = Blob(as_text, EncodingANSI!)
  IF NOT CryptHashData(hHash, bl_text, Len(bl_text),  0 ) THEN 
...
Подправил функцию CryptHashData на Blob и внес предложенное исправление и всё заработало.
Спасибо "автору", видимо он тоже на этом форуме бывает.
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36177901
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISА по поводу кода:
>> ЗЗЫ. И перестаньте гадать, а то почитал ваш код и прослезился :)
так он не мой, я в самом начале на него ссылку дал. Был и другой похожий вариант. И оба вроде бы рабочие под РВ10, но по факту у меня ни один не заработал. :(

Под гаданием я имел в виду не исходный код, а именно ваши модификации, где вы передаете строку в формате Unicode, а ее размер - в символах, хотя надо в байтах.
:)
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36452352
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по этой же теме:
В ПО делаю вычисления MD5. Используемая библиотека - advapi32.dll.
У одного из пользователей, у которого Vista, значение не совпало с тестовым.
Что может быть причиной?
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36453110
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое может быть из-за другого языка ОС.
Например если юникодный текст для хеширования преобразуется в блоб таким образом:
Код: plaintext
1.
bl_text = Blob(as_text, EncodingANSI!)
то результат будет зависеть от текущей кодовой страницы в винде.
Например русский текст в арабской винде превратится в ??????, т.к. в арабской кодовой странице Win1256 нет русских символов.

Если ваша проблема из-за этого, то ее можно избежать, если хешировать непосредственно юникод, без преобразования в другие кодировки.
Если требуется чтобы тестовые примеры о которых речь идет выше давали тот же хеш, то можно преобразовывать в UTF-8. В этом случае тексты в ASCII (это английские, цифры, пунктуация) будут давать такой же результат как и ANSI, т.к. UTF-8 совместима с кодовыми страницами ANSI в пределах 7-битных символов (ASCII). А если есть национальные символы(более 7 бит) - то результат будет отличаться.
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36453199
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТакое может быть из-за другого языка ОС.
Например если юникодный текст для хеширования преобразуется в блоб таким образом:
Код: plaintext
1.
bl_text = Blob(as_text, EncodingANSI!)
то результат будет зависеть от текущей кодовой страницы в винде.
Например русский текст в арабской винде превратится в ??????, т.к. в арабской кодовой странице Win1256 нет русских символов.

Если ваша проблема из-за этого, то ее можно избежать, если хешировать непосредственно юникод, без преобразования в другие кодировки.
Если требуется чтобы тестовые примеры о которых речь идет выше давали тот же хеш, то можно преобразовывать в UTF-8. В этом случае тексты в ASCII (это английские, цифры, пунктуация) будут давать такой же результат как и ANSI, т.к. UTF-8 совместима с кодовыми страницами ANSI в пределах 7-битных символов (ASCII). А если есть национальные символы(более 7 бит) - то результат будет отличаться.
Да, я использую эту строку. Но:
Винда, со слов пользователя, русская и в проверочном тексте только английские буквы, цифры и пунктуация.
С UTF-8 на русской винде вроде работает правильно с текстом и на русском, и на английском.
Спасибо за совет. Буду надеется, что этого достаточно будет.
Конечно, мысли посещают разные (от отсутствия доступа либо отсутствия вообще dll и CryptoProvider-а, влияние вирусов и в т.ч. нерусской винды).
Но как дистанционно понять таки в чем причина, чтобы сильно не напрегать пользователя, если причина не в этом?
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36453216
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISсо слов пользователя
Рекомендую НИКОГДА не доверять словам пользователей.
Даже когда они искренне в чем то уверены, это не значит, что так оно и есть на самом деле.
Пользователи существуют в параллельном пространстве, где устоявшиеся ИТ термины могут значить что угодно, а многие события которые отображаются на экране пользователями не воспринимаются как существенные, поскольку если они не понимают сути происходящего то после нескольких повторов они просто игнорируют эти артефакты - они для них становятся частью интерфейса, и вы никогда "со слов пользователя" о них не узнаете.

Что касается проблемы:
1) Думаю что UTF-8 - это наиболее разумный выбор, поскольку это стандарт дефакто для кодирования текстов в интернете.

2) Я бы проверил еще что проблема не связана с версией используемого криптопровайдера.
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36453290
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyРекомендую НИКОГДА не доверять словам пользователей.
Так вроде этого и придерживаюсь. Но по факту все-таки принимаю к сведению то, что говорят "начинающие пользователи", а вот в словах "продвинутых" однозначно сомневаюсь. Последние могут и скиншотик смастерить, и сообщение нужное смоделировать. :)
Anatoly Moskovsky
Что касается проблемы:
1) Думаю что UTF-8 - это наиболее разумный выбор, поскольку это стандарт дефакто для кодирования текстов в интернете.

2) Я бы проверил еще что проблема не связана с версией используемого криптопровайдера.
Пока на этом и остановился:
1) Изменю на UTF-8
2) Добавлю проверку криптопровайдера.
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36855157
Zin4uk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как получить мд5 фала? пробовал получить блоб и преобразовать в строку для функции, но ничего не получилось...
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36876935
Kent_vrn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Недавно dll для этого собрал. Вот код ля подключения функций:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function boolean MakeFileHash (string filename, ref string md5, long dTypeHash) library "Hash.dll" alias for "MakeFileHash;Ansi";
function boolean CheckFileHash(string pFileName, string pHash, long dTypeHash) library "Hash.dll" alias for "CheckFileHash;Ansi";
function boolean MakeMemoryHash(string pMemory, long size, string pHash, long dTypeHash) library "Hash.dll" alias for "MakeMemoryHash;Ansi";
function boolean CheckMemoryHash(string pMemory, long size, string pHash, long dTypeHash) library "Hash.dll" alias for "CheckMemoryHash;Ansi";
//Тип алгоритма dTypeHash:
//#define HASH_ID_NULL             0 
//#define HASH_ID_CRC16            1 
//#define HASH_ID_CRC16CCITT       2 
//#define HASH_ID_CRC32            3 
//#define HASH_ID_FCS_16           4 
//#define HASH_ID_FCS_32           5 
//#define HASH_ID_GHASH_32_3       6 
//#define HASH_ID_GHASH_32_5       7 
//#define HASH_ID_GOST             8 
//#define HASH_ID_HAVAL            9 
//#define HASH_ID_MD2             10 
//#define HASH_ID_MD4             11 
//#define HASH_ID_MD5             12 
//#define HASH_ID_SHA1            13 
//#define HASH_ID_SHA2_256        14 
//#define HASH_ID_SHA2_384        15 
//#define HASH_ID_SHA2_512        16 
//#define HASH_ID_TIGER           17 

Дальше думаю разобраться сможешь
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36885236
Zin4uk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kent_vrnНедавно dll для этого собрал. Вот код ля подключения функций:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function boolean MakeFileHash (string filename, ref string md5, long dTypeHash) library "Hash.dll" alias for "MakeFileHash;Ansi";
function boolean CheckFileHash(string pFileName, string pHash, long dTypeHash) library "Hash.dll" alias for "CheckFileHash;Ansi";
function boolean MakeMemoryHash(string pMemory, long size, string pHash, long dTypeHash) library "Hash.dll" alias for "MakeMemoryHash;Ansi";
function boolean CheckMemoryHash(string pMemory, long size, string pHash, long dTypeHash) library "Hash.dll" alias for "CheckMemoryHash;Ansi";
//Тип алгоритма dTypeHash:
//#define HASH_ID_NULL             0 
//#define HASH_ID_CRC16            1 
//#define HASH_ID_CRC16CCITT       2 
//#define HASH_ID_CRC32            3 
//#define HASH_ID_FCS_16           4 
//#define HASH_ID_FCS_32           5 
//#define HASH_ID_GHASH_32_3       6 
//#define HASH_ID_GHASH_32_5       7 
//#define HASH_ID_GOST             8 
//#define HASH_ID_HAVAL            9 
//#define HASH_ID_MD2             10 
//#define HASH_ID_MD4             11 
//#define HASH_ID_MD5             12 
//#define HASH_ID_SHA1            13 
//#define HASH_ID_SHA2_256        14 
//#define HASH_ID_SHA2_384        15 
//#define HASH_ID_SHA2_512        16 
//#define HASH_ID_TIGER           17 

Дальше думаю разобраться сможешь

Спасибо, но проблема в том что я сейчас пишу на 9м билдере, а длл, как я понимаю на 10 (не знаю или это имеет значение), и при работе с функциями появляется ошибка "Error opening dll library for external function ..." Буду пытаться решить проблему, но возможно Вы подскажите ответ раньше...
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36885268
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zin4uk,

Уберите ;Ansi из деклараций функций.
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36894051
Zin4uk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локшин Марк,

Не помогает, при обычном запуске ошибка "Bad runtime function reference..." а в режиме отладки "Error opening dll library for external function ..."

использую дикларацию
function boolean MakeFileHash (string filename, ref string md5, long dTypeHash) library "Hash.dll" alias for "MakeFileHash"
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36894873
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не находит DLL.
Разместите ее либо в PATH либо в папке с EXE (для запуска из IDE это папка где лежит pbXXX.exe).
...
Рейтинг: 0 / 0
MD5 и PB10.5
    #36898942
Zin4uk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

Да, проблема была в том что не находило dll. Оказалось что в процессе выполнения программы менялся путь и когда обращался к функции dll, то искало не в папке с исполнительным файлом, а другой. Решил проблему функцией ChangeDirectory(*директория_исполняемого_файла*) перед вызовом. Большое спасибо за dll и всем кто помог решить проблему!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / MD5 и PB10.5
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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