Страница: 1 | 2 | 3 | 4 | 5 |
Вопрос: Нужно реализацию md5 на MS VC++ 2003
Добавлено: 13.04.07 00:37
Автор вопроса: ZagZag | ICQ: 295002202
Ответы
Всего ответов: 70
Номер ответа: 31
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #31
Добавлено: 13.04.07 23:03
Смотря каких. Не проще ли будет отдизасмить PasswordsPro, если тебе нужна хорошая скорость?
Номер ответа: 32
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #32
Добавлено: 13.04.07 23:23
400-500 тыс. хешей в секунду меня вполне устроит. Но надо чтобы это
было на сишке.
Дизасмить PasswordsPro у меня еще IDA не доросла Темболее что он
еще и упакован фиг знает чем.
Вобщем проблема пока что одна: как функции из lib (на masm) передать
параметры из MS VC++
Номер ответа: 33
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #33
Добавлено: 14.04.07 01:19
Напиши объявление этой функции и прилинкуй либ
Проверить пока не могу, но выглядеть это должно примерно так:
extern "C" {
void procMD5hash(void *buff, void *hashbuff);
}
Номер ответа: 34
Автор ответа:
W[4Fh]LF
Вопросов: 0
Ответов: 187
Web-сайт:
Профиль | | #34
Добавлено: 14.04.07 14:32
Код, который дан на первой странице не совсем полный, он в конце не преобразует хеш в строку, он был очень хорошо оптимизирован(если кто сможет написать более быстрый вариант, хотя бы процентов на 10, может считать себя гуру оптимизации).
Надо немножко дополнить процедуру, переделав её следующим образом:
1. в asm файл следующее:
;Coded by W[4Fh]LF
;http://hunger.ru
;icq:605600
;mail: wolf__itdefence.ru
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
include C:\masm32\macros\Strings.mac
procMD5hash proto :DWORD,:DWORD,:DWORD
.const
.data
hexnum  B "0123456789abcdef",0
.data?
.code
DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax,TRUE
ret
DllEntry Endp
procMD5hash proc uses ebx edi esi eax edx ebx, inBuffer:dword, \
szBuffer:dword, outBuffer: dword
local TempStr[16]:byte
;align 16
mov esi,inBuffer
mov eax,szBuffer
mov byte ptr [esi + eax],80h
mov ebx,eax
inc ebx
.while ebx<65
mov dword ptr [esi + ebx],0
add ebx,4
.endw
shl eax,3
mov word ptr [esi + 56],ax
mov word ptr [esi + 58],0
push ebp
mov eax,067452301h
mov ebx,0efcdab89h
mov ecx,098badcfeh
mov edx,010325476h
mov ebp,ebx
mov edi,ebx
not ebp
and edi,ecx
and ebp,edx
add eax,[esi]
or edi,ebp
add eax,edi
add eax,0d76aa478h
rol eax,07h
add eax,ebx
mov ebp,eax
mov edi,eax
not ebp
and edi,ebx
and ebp,ecx
add edx,[esi+4]
or edi,ebp
add edx,edi
add edx,0e8C7b756h
rol edx,0ch
add edx,eax
mov ebp,edx
mov edi,edx
not ebp
and edi,eax
and ebp,ebx
add ecx,[esi+8]
or edi,ebp
add ecx,edi
add ecx,0242070dbh
rol ecx,11h
add ecx,edx
mov ebp,ecx
mov edi,ecx
not ebp
and edi,edx
and ebp,eax
add ebx,[esi+0ch]
or edi,ebp
add ebx,edi
add ebx,0c1bdceeeh
rol ebx,16h
add ebx,ecx
mov ebp,ebx
mov edi,ebx
not ebp
and edi,ecx
and ebp,edx
add eax,[esi+10h]
or edi,ebp
add eax,edi
add eax,0f57c0fafh
rol eax,07h
add eax,ebx
mov ebp,eax
mov edi,eax
not ebp
and edi,ebx
and ebp,ecx
add edx,[esi+14h]
or edi,ebp
add edx,edi
add edx,04787c62ah
rol edx,0ch
add edx,eax
mov ebp,edx
mov edi,edx
not ebp
and edi,eax
and ebp,ebx
add ecx,[esi+18h]
or edi,ebp
add ecx,edi
add ecx,0a8304613h
rol ecx,11h
add ecx,edx
mov ebp,ecx
mov edi,ecx
not ebp
and edi,edx
and ebp,eax
add ebx,[esi+1ch]
or edi,ebp
add ebx,edi
add ebx,0fd469501h
rol ebx,16h
add ebx,ecx
mov ebp,ebx
mov edi,ebx
not ebp
and edi,ecx
and ebp,edx
add eax,[esi+20h]
or edi,ebp
add eax,edi
add eax,0698098d8h
rol eax,07h
add eax,ebx
mov ebp,eax
mov edi,eax
not ebp
and edi,ebx
and ebp,ecx
add edx,[esi+24h]
or edi,ebp
add edx,edi
add edx,08b44f7afh
rol edx,0ch
add edx,eax
mov ebp,edx
mov edi,edx
not ebp
and edi,eax
and ebp,ebx
add ecx,[esi+28h]
or edi,ebp
add ecx,edi
add ecx,0ffff5bb1h
rol ecx,11h
add ecx,edx
mov ebp,ecx
mov edi,ecx
not ebp
and edi,edx
and ebp,eax
add ebx,[esi+2ch]
or edi,ebp
add ebx,edi
add ebx,0895cd7beh
rol ebx,16h
add ebx,ecx
mov ebp,ebx
mov edi,ebx
not ebp
and edi,ecx
and ebp,edx
add eax,[esi+30h]
or edi,ebp
add eax,edi
add eax,06b901122h
rol eax,07h
add eax,ebx
mov ebp,eax
mov edi,eax
not ebp
and edi,ebx
and ebp,ecx
add edx,[esi+34h]
or edi,ebp
add edx,edi
add edx,0fd987193h
rol edx,0ch
add edx,eax
mov ebp,edx
mov edi,edx
not ebp
and edi,eax
and ebp,ebx
add ecx,[esi+38h]
or edi,ebp
add ecx,edi
add ecx,0a679438eh
rol ecx,11h
add ecx,edx
mov ebp,ecx
mov edi,ecx
not ebp
and edi,edx
and ebp,eax
add ebx,[esi+3ch]
or edi,ebp
add ebx,edi
add ebx,049b40821h
rol ebx,16h
add ebx,ecx
mov ebp,edx
mov edi,edx
not ebp
and edi,ebx
and ebp,ecx
add eax,[esi+04h]
or edi,ebp
add eax,edi
add eax,0f61e2562h
rol eax,05h
add eax,ebx
mov ebp,ecx
mov edi,ecx
not ebp
and edi,eax
and ebp,ebx
add edx,[esi+18h]
or edi,ebp
add edx,edi
add edx,0c040b340h
rol edx,09h
add edx,eax
mov ebp,ebx
mov edi,ebx
not ebp
and edi,edx
and ebp,eax
add ecx,[esi+2ch]
or edi,ebp
add ecx,edi
add ecx,0265e5a51h
rol ecx,0eh
add ecx,edx
mov ebp,eax
mov edi,eax
not ebp
and edi,ecx
and ebp,edx
add ebx,[esi]
or edi,ebp
add ebx,edi
add ebx,0e9b6c7aah
rol ebx,14h
add ebx,ecx
mov ebp,edx
mov edi,edx
not ebp
and edi,ebx
and ebp,ecx
add eax,[esi+14h]
or edi,ebp
add eax,edi
add eax,0d62f105dh
rol eax,05h
add eax,ebx
mov ebp,ecx
mov edi,ecx
not ebp
and edi,eax
and ebp,ebx
add edx,[esi+28h]
or edi,ebp
add edx,edi
add edx,002441453h
rol edx,09h
add edx,eax
mov ebp,ebx
mov edi,ebx
not ebp
and edi,edx
and ebp,eax
add ecx,[esi+3ch]
or edi,ebp
add ecx,edi
add ecx,0d8a1e681h
rol ecx,0eh
add ecx,edx
mov ebp,eax
mov edi,eax
not ebp
and edi,ecx
and ebp,edx
add ebx,[esi+10h]
or edi,ebp
add ebx,edi
add ebx,0e7d3fbc8h
rol ebx,14h
add ebx,ecx
mov ebp,edx
mov edi,edx
not ebp
and edi,ebx
and ebp,ecx
add eax,[esi+24h]
or edi,ebp
add eax,edi
add eax,021e1cde6h
rol eax,05h
add eax,ebx
mov ebp,ecx
mov edi,ecx
not ebp
and edi,eax
and ebp,ebx
add edx,[esi+38h]
or edi,ebp
add edx,edi
add edx,0c33707d6h
rol edx,09h
add edx,eax
mov ebp,ebx
mov edi,ebx
not ebp
and edi,edx
and ebp,eax
add ecx,[esi+0ch]
or edi,ebp
add ecx,edi
add ecx,0f4d50d87h
rol ecx,0eh
add ecx,edx
mov ebp,eax
mov edi,eax
not ebp
and edi,ecx
and ebp,edx
add ebx,[esi+20h]
or edi,ebp
add ebx,edi
add ebx,0455a14edh
rol ebx,14h
add ebx,ecx
mov ebp,edx
mov edi,edx
not ebp
and edi,ebx
and ebp,ecx
add eax,[esi+34h]
or edi,ebp
add eax,edi
add eax,0a9e3e905h
rol eax,05h
add eax,ebx
mov ebp,ecx
mov edi,ecx
not ebp
and edi,eax
and ebp,ebx
add edx,[esi+08h]
or edi,ebp
add edx,edi
add edx,0fcefa3f8h
rol edx,09h
add edx,eax
mov ebp,ebx
mov edi,ebx
not ebp
and edi,edx
and ebp,eax
add ecx,[esi+1ch]
or edi,ebp
add ecx,edi
add ecx,0676f02d9h
rol ecx,0eh
add ecx,edx
mov ebp,eax
mov edi,eax
not ebp
and edi,ecx
and ebp,edx
add ebx,[esi+30h]
or edi,ebp
add ebx,edi
add ebx,08d2a4c8ah
rol ebx,14h
add ebx,ecx
mov ebp,edx
add eax,[esi+14h]
xor ebp,ecx
xor ebp,ebx
add eax,ebp
add eax,0fffa3942h
rol eax,04h
add eax,ebx
mov ebp,ecx
add edx,[esi+20h]
xor ebp,ebx
xor ebp,eax
add edx,ebp
add edx,08771f681h
rol edx,0bh
add edx,eax
mov ebp,ebx
add ecx,[esi+2ch]
xor ebp,eax
xor ebp,edx
add ecx,ebp
add ecx,06d9d6122h
rol ecx,10h
add ecx,edx
mov ebp,eax
add ebx,[esi+38h]
xor ebp,edx
xor ebp,ecx
add ebx,ebp
add ebx,0fde5380ch
rol ebx,17h
add ebx,ecx
mov ebp,edx
add eax,[esi+04h]
xor ebp,ecx
xor ebp,ebx
add eax,ebp
add eax,0a4beea44h
rol eax,04h
add eax,ebx
mov ebp,ecx
add edx,[esi+10h]
xor ebp,ebx
xor ebp,eax
add edx,ebp
add edx,04bdecfa9h
rol edx,0bh
add edx,eax
mov ebp,ebx
add ecx,[esi+1ch]
xor ebp,eax
xor ebp,edx
add ecx,ebp
add ecx,0f6bb4b60h
rol ecx,10h
add ecx,edx
mov ebp,eax
add ebx,[esi+28h]
xor ebp,edx
xor ebp,ecx
add ebx,ebp
add ebx,0bebfbc70h
rol ebx,17h
add ebx,ecx
mov ebp,edx
add eax,[esi+34h]
xor ebp,ecx
xor ebp,ebx
add eax,ebp
add eax,0289b7ec6h
rol eax,04h
add eax,ebx
mov ebp,ecx
add edx,[esi]
xor ebp,ebx
xor ebp,eax
add edx,ebp
add edx,0eaa127fah
rol edx,0bh
add edx,eax
mov ebp,ebx
add ecx,[esi+0ch]
xor ebp,eax
xor ebp,edx
add ecx,ebp
add ecx,0d4ef3085h
rol ecx,10h
add ecx,edx
mov ebp,eax
add ebx,[esi+18h]
xor ebp,edx
xor ebp,ecx
add ebx,ebp
add ebx,004881d05h
rol ebx,17h
add ebx,ecx
mov ebp,edx
add eax,[esi+24h]
xor ebp,ecx
xor ebp,ebx
add eax,ebp
add eax,0d9d4d039h
rol eax,04h
add eax,ebx
mov ebp,ecx
add edx,[esi+30h]
xor ebp,ebx
xor ebp,eax
add edx,ebp
add edx,0e6db99e5h
rol edx,0bh
add edx,eax
mov ebp,ebx
add ecx,[esi+3ch]
xor ebp,eax
xor ebp,edx
add ecx,ebp
add ecx,01fa27cf8h
rol ecx,10h
add ecx,edx
mov ebp,eax
add ebx,[esi+08h]
xor ebp,edx
xor ebp,ecx
add ebx,ebp
add ebx,0c4ac5665h
rol ebx,17h
add ebx,ecx
mov edi,edx
add eax,[esi]
not edi
or edi,ebx
xor edi,ecx
add eax,edi
add eax,0f4292244h
rol eax,06h
add eax,ebx
mov edi,ecx
add edx,[esi+1ch]
not edi
or edi,eax
xor edi,ebx
add edx,edi
add edx,0432aff97h
rol edx,0ah
add edx,eax
mov edi,ebx
add ecx,[esi+38h]
not edi
or edi,edx
xor edi,eax
add ecx,edi
add ecx,0ab9423a7h
rol ecx,0fh
add ecx,edx
mov edi,eax
add ebx,[esi+14h]
not edi
or edi,ecx
xor edi,edx
add ebx,edi
add ebx,0fc93a039h
rol ebx,15h
add ebx,ecx
mov edi,edx
add eax,[esi+30h]
not edi
or edi,ebx
xor edi,ecx
add eax,edi
add eax,0655b59c3h
rol eax,06h
add eax,ebx
mov edi,ecx
add edx,[esi+0ch]
not edi
or edi,eax
xor edi,ebx
add edx,edi
add edx,08f0ccc92h
rol edx,0ah
add edx,eax
mov edi,ebx
add ecx,[esi+28h]
not edi
or edi,edx
xor edi,eax
add ecx,edi
add ecx,0ffeff47dh
rol ecx,0fh
add ecx,edx
mov edi,eax
add ebx,[esi+04h]
not edi
or edi,ecx
xor edi,edx
add ebx,edi
add ebx,085845dd1h
rol ebx,15h
add ebx,ecx
mov edi,edx
add eax,[esi+20h]
not edi
or edi,ebx
xor edi,ecx
add eax,edi
add eax,06fa87e4fh
rol eax,06h
add eax,ebx
mov edi,ecx
add edx,[esi+3ch]
not edi
or edi,eax
xor edi,ebx
add edx,edi
add edx,0fe2ce6e0h
rol edx,0ah
add edx,eax
mov edi,ebx
add ecx,[esi+18h]
not edi
or edi,edx
xor edi,eax
add ecx,edi
add ecx,0a3014314h
rol ecx,0fh
add ecx,edx
mov edi,eax
add ebx,[esi+34h]
not edi
or edi,ecx
xor edi,edx
add ebx,edi
add ebx,04e0811a1h
rol ebx,15h
add ebx,ecx
mov edi,edx
add eax,[esi+10h]
not edi
or edi,ebx
xor edi,ecx
add eax,edi
add eax,0f7537e82h
rol eax,06h
add eax,ebx
mov edi,ecx
add edx,[esi+2ch]
not edi
or edi,eax
xor edi,ebx
add edx,edi
add edx,0bd3af235h
rol edx,0ah
add edx,eax
mov edi,ebx
add ecx,[esi+08h]
not edi
or edi,edx
xor edi,eax
add ecx,edi
add ecx,02ad7d2bbh
rol ecx,0fh
add ecx,edx
mov edi,eax
add ebx,[esi+24h]
not edi
or edi,ecx
xor edi,edx
add ebx,edi
add ebx,0eb86d391h
rol ebx,15h
add ebx,ecx
pop ebp
lea esi,TempStr
add eax,067452301h
mov [esi],eax
add ebx,0efcdab89h
mov [esi+4],ebx
add ecx,098badcfeh
mov [esi+8],ecx
add edx,010325476h
mov [esi+12],edx
mov ecx,16
mov edi,outBuffer
@@:
lodsb
xor ah,ah
ror ax,4
shr ah,4
movsx edx,ah
mov ah,byte ptr [hexnum + edx]
movsx edx,al
mov al,byte ptr [hexnum + edx]
mov word ptr[edi],ax
add edi,2
dec ecx
jne @b
ret
procMD5hash endp
End DllEntry
2. в def файл:
LIBRARY Example
EXPORTS
procMD5hash
3. Компилируем так:
set cmpl=C:\masm32
%cmpl%\bin\ml /nologo /c /coff /Cp /IC:\masm32\include\ dll.asm
%cmpl%\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%cmpl%\lib /DLL /DEF:dll.def dll.obj
%cmpl%\bin\link -lib dll.obj
del *.exp
del *.obj
pause
4. Используем так:
#include <iostream>
#pragma comment (lib, "md5.lib"
extern "C" {
void _stdcall procMD5hash(void* inBuffer,
unsigned int szBuffer,
void* outBuffer);
}
using namespace std;
int main(int argc, char* argv[]
{
char szHash[256] = {0};
char szText[256] = {0};
cout << "Enter text for create hash: ";
cin >> szText;
procMD5hash(szText, strlen(szText), szHash);
cout << szHash;
return 0;
}
Номер ответа: 35
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #35
Добавлено: 14.04.07 15:02
Спасибо, большое! Это - то что я искал!
Пример точно работает.
Номер ответа: 36
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #36
Добавлено: 14.04.07 18:40
Номер ответа: 37
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #37
Добавлено: 14.04.07 19:26
Не думаю, что дотнетовская реализация будет существенно быстрее.
Номер ответа: 38
Автор ответа:
W[4Fh]LF
Вопросов: 0
Ответов: 187
Web-сайт:
Профиль | | #38
Добавлено: 14.04.07 19:51
Было бы интересно посоревноваться
Номер ответа: 39
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #39
Добавлено: 14.04.07 20:04
Номер ответа: 40
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #40
Добавлено: 15.04.07 02:42
Не удержался и проверил. Результат меня просто поразил, даже несмотря на то, что я и ранее не был фанатом дотнета:
C# 2921 3218 3109 3390 3062
PHP 577 580 582 584 577
С++ 90 86 84 89 86
asm 50 51 54 51 50
На C++ была взята реализация из стандарта, на ассемблере - реализация от BUG(O)R. На этой же машине скорость генераций хэшей PasswordPro 2.3 млн. хэшей в секунду. Разумеется, везде (кроме PHP) была использована конфигурация Release, запуск из командной строки.
Попробуйте найти, где я написал фигню, которая может оправдать ШЕСТИДЕСЯТИКРАТНЫЙ проигрыш в скорости:
using System.Collections.Generic;
using System.Text;
namespace md5bench
{
class Program
{
static void Main(string[] args)
{
System.Security.Cryptography.MD5CryptoServiceProvider md5 =
new System.Security.Cryptography.MD5CryptoServiceProvider();
System.DateTime dt;
byte from = (byte)'A', to = (byte)'J';
byte[] s = {0,0,0,0,0};
Int32 sum = 0;
dt = System.DateTime.Now;
for (byte c0 = from; c0 <= to; c0++)
{
s[0] = c0;
for (byte c1 = from; c1 <= to; c1++)
{
s[1] = c1;
for (byte c2 = from; c2 <= to; c2++)
{
s[2] = c2;
for (byte c3 = from; c3 <= to; c3++)
{
s[3] = c3;
for (byte c4 = from; c4 <= to; c4++)
{
s[4] = c4;
sum += md5.ComputeHash(s)[7];
}
}
}
}
}
System.TimeSpan ts = System.DateTime.Now.Subtract(dt);
Console.Write("one, control = {0}; time = {1} ms", sum, ts.TotalMilliseconds);
}
}
}
Номер ответа: 41
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #41
Добавлено: 15.04.07 02:52
Потрясающе, сделал строку константной, время почти не изменилось!
dt = System.DateTime.Now;
for (int i = 0; i < 100000; i++)
{
s += md5.ComputeHash(b)[7];
}
System.TimeSpan ts = System.DateTime.Now.Subtract(dt);
Кажется, миф о быстродействии дотнета и его недобиблы FCL развеян окончательно
Номер ответа: 42
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #42
Добавлено: 15.04.07 03:10
Предположил, что такое время связано с какими-нибудь длительными действиями, осуществляемыми при запуске программы и не заканчивающимися с началом бенчмарка. Для проверки увеличил число итераций цикла до 10 миллионов (в 100 раз). Время увеличилось линейно, что доказывает связь числа вызовов процедуры с временем: 304609 мсек
Номер ответа: 43
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #43
Добавлено: 15.04.07 03:29
Замерил время расчета 10 миллионов хэшей и занимаемую программой память:
C# 304609 мсек 4784 КБ физ., 7260 КБ вирт.
PHP 48708 мсек 6164 КБ физ., 5280 КБ вирт.
C++ 8246 мсек 1304 КБ физ., 360 КБ вирт.
asm 4747 мсек 1300 КБ физ., 360 КБ вирт.
Следует учесть, что в случае PHP замерялась память, занимаемая всем интерпретатором целиком.
Итак, скорость расчета (хэшей в секунду):
C# 32.8 тыс - смешно и говорить
PHP 205 тыс. - чисто интерпретируемый язык обогнал компилируемый почти в 7 раз.
C++ 1.21 млн. - стандартная реализация с вызовом MDInit, MDUpdate и MDFinal
asm 2.11 млн. - хорошая реализация от BUG(O)R aka W[4Fh]LF, вызывается из программы на C++
PasswordsPro 2.51 млн. - по праву считается лучшей
Номер ответа: 44
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #44
Добавлено: 15.04.07 05:05
успокойся, Brand'у это ненадо, он занят зарабатыванием денег, он читает эту тему но врядли отпостит сюда
Номер ответа: 45
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #45
Добавлено: 15.04.07 05:31
На вб6 ~ 33 мсек
класс md5 by Robert Hubley (c)
Но там алгоритм не на скорость, а скорее на понятность, при генирации хеша там сколько сдвигов столько раз и вызываются функции, а внутри них ещё вызываются какие-то вспомогательные... Наверное основаная часть времени именно на вызов функций идёт. Если переписать для скорости дотнет будет вообще в пыли )