Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: VC++ 2 VB Добавлено: 16.08.05 22:45  

Автор вопроса:  Black Dragon | Web-сайт: в разработке | ICQ: 321186096 
Ребята! Кто хорошо знает как Visual C++, так и VB, помогите перевести код! Очень нужно!

Вот исходники:
1. MD5.cpp:
// ===============================
// Заголовки и служебные процедуры
// ===============================
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <windows.h>
#include <commctrl.h>
#include <commdlg.h>
#include <limits.h>
#include <crtdbg.h>
#include <stdlib.h>
#include <stdio.h>

#ifndef _DEBUG // Сокращает размер exe-шника
#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/ENTRY:WinMain")
#endif

HANDLE heap;
#ifndef _DEBUG
void inline *malloc2(size_t n) // Выделение и освобождение памяти
{    
return HeapAlloc(heap, HEAP_NO_SERIALIZE, n);
}
#define malloc(a) malloc2(a)
void inline *realloc2(void* p, size_t n)
{   if (p == NULL) return malloc(n);
    return HeapReAlloc(heap, HEAP_ZERO_MEMORY | HEAP_NO_SERIALIZE, p, n);
}
#define realloc(a, b) realloc2(a, b)
void inline free2(void* p)
{   if (p == NULL) return;
    HeapFree(heap, HEAP_NO_SERIALIZE, p);
}
#define free(n) free2(n)
#endif

ULONG reversebytes(ULONG x) { // Из little-endian в big-endian -- TODO: инструкция BSWAP!!!
return (x >> 24) | (x >> 8) & 0xFF00 | (x << 8) & 0xFF0000 | (x << 24) & 0xFF000000;
}

#include "resource.h"

HINSTANCE hInst;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

// ================================
// Собственно код вычисления MD5 :)
// ================================

const ULONG _F[] = { // Константы t, используемые на каждом этапе в каждой из операций
0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,
0x6b901122,0xfd987193,0xa679438e,0x49b40821},
_G[] = {
0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,
0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,
0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a},
_H[] = {
0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,
0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,
0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665},
_I[] = {
0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,
0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,
0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391};

// Порядок использования подблоков на 2-м, 3-м, 4-м этапе
const UINT _g[] = {1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12},
   _h[] = {5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2},
   _i[] = {0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9};

typedef ULONG (*NLF)(ULONG, ULONG, ULONG); // Объявление типа нелинейной функции
// Нелинейные функции, определенные в описании MD5
ULONG inline F(ULONG X, ULONG Y, ULONG Z) {
return (Z ^ (X & (Y ^ Z)));
}

ULONG inline G(ULONG X, ULONG Y, ULONG Z) {
return F(Z, X, Y);
}

ULONG inline H(ULONG X, ULONG Y, ULONG Z) {
return X ^ Y ^ Z;
}

ULONG inline I(ULONG X, ULONG Y, ULONG Z) {
return Y ^ (X | (~Z));
}

#define ROLIT(xx) case xx: __asm{rol z, xx} break;
// Одна операция хэширования
template <NLF func, ULONG s> void inline Operation(ULONG& a, ULONG b, ULONG c, ULONG d, ULONG M, ULONG t) {
ULONG z;
z = a + func(b, c, d) + M + t;
#ifdef _MSC_VER
switch (s) { // Хитрый трюк для компилятора MSVC++
ROLIT(7) ROLIT(12) ROLIT(17) ROLIT(22)
ROLIT(5) ROLIT(9) ROLIT(14) ROLIT(20)
ROLIT(4) ROLIT(11) ROLIT(16) ROLIT(23)
ROLIT(6) ROLIT(10) ROLIT(15) ROLIT(21)
}
#else
z = (z << s) | (z >>(32-s)); // Для остальных компиляторов менее оптимизированный код
#endif
a = b + z;
}

void inline MD5(char* s, ULONG len, ULONG len2, ULONG& A, ULONG& B, ULONG& C, ULONG& D) {
*(ULONG*)(s + len2 - 8) = len * 8; // Записываем длину в последние 64 бита
*(ULONG*)(s + len2 - 4) = 0;
*(UCHAR*)(s + len) = 0x80; // Заполнение единицей и нулями
memset(s + len + 1, '\0', len2 - 8 - len - 1);
A = 0x67452301, B = 0xefcdab89, C = 0x98badcfe, D = 0x10325476;
for(ULONG* m = (ULONG*)s; m < (ULONG*)(s + len2); m += 16) { // Основной цикл
ULONG a = A, b = B, c = C, d = D;
for(int i = 0; i < 16; i+=4) { // 16 операций на первом этапе
Operation<F, 7>(a, b, c, d, *(m+i+0), _F[i+0]); // 1-й этап
Operation<F, 12>(d, a, b, c, *(m+i+1),_F[i+1]);
Operation<F, 17>(c, d, a, b, *(m+i+2),_F[i+2]);
Operation<F, 22>(b, c, d, a, *(m+i+3),_F[i+3]);
}
for(int i = 0; i < 16; i+=4) { // 16 операций на втором этапе
Operation<G, 5>(a, b, c, d, *(m+_g[i+0]),  _G[i+0]);
Operation<G, 9>(d, a, b, c, *(m+_g[i+1]),  _G[i+1]);
Operation<G, 14>(c, d, a, b, *(m+_g[i+2]), _G[i+2]);
Operation<G, 20>(b, c, d, a, *(m+_g[i+3]), _G[i+3]);
}
for(int i = 0; i < 16; i+=4) { // 16 операций на третьем этапе
Operation<H, 4>(a, b, c, d, *(m+_h[i+0]),  _H[i+0]);
Operation<H, 11>(d, a, b, c, *(m+_h[i+1]), _H[i+1]);
Operation<H, 16>(c, d, a, b, *(m+_h[i+2]), _H[i+2]);
Operation<H, 23>(b, c, d, a, *(m+_h[i+3]), _H[i+3]);
}
for(int i = 0; i < 16; i+=4) { // 16 операций на четвертом этапе
Operation<I, 6>(a, b, c, d, *(m+_i[i+0]),  _I[i+0]);
Operation<I, 10>(d, a, b, c, *(m+_i[i+1]), _I[i+1]);
Operation<I, 15>(c, d, a, b, *(m+_i[i+2]), _I[i+2]);
Operation<I, 21>(b, c, d, a, *(m+_i[i+3]), _I[i+3]);
}
A += a, B += b, C += c, D += d;
}
}

// Вычисление SHA-256
// Магические числа хэш-функции
const ULONG h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a;
const ULONG h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19;
const ULONG k[] = {
   0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
   0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
   0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
   0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
   0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
   0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
   0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
   0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
};

ULONG inline ror(ULONG x, ULONG z) {
/*
#ifdef _MSC_VER
__asm{ // Циклический сдвиг на 11 битов влево
ror x, z
}
#else*/
x = x>>z | x<<(32-z);
//#endif
return x;
}

inline void SHA256(UCHAR *t, DWORD len, DWORD len2, ULONG& A, ULONG& B, ULONG& C, ULONG& D, ULONG& E, ULONG& F, ULONG& G, ULONG& H) { // Основная процедура вычисления хэша
A = h0, B = h1, C = h2, D = h3, E = h4, F = h5, G = h6, H = h7;
*(ULONG*)(t + len2 - 8) = reversebytes(len >> (32-3)); // Записываем длину в последние 64 бита
*(ULONG*)(t + len2 - 4) = reversebytes(len << 3);
*(UCHAR*)(t + len) = 0x80; // Заполнение единицей и нулями
memset(t + len + 1, '\0', len2 - 8 - len - 1);
for(ULONG* m = (ULONG*)t; m < (ULONG*)(t + len2); m += 16){
ULONG a = A, b = B, c = C, d = D, e = E, f = F, g = G, h = H;
ULONG w[64];
for(int i = 0; i < 16; ++i) {
ULONG s0, m0, t0, s1, m1, t1;
__asm{
mov eax, a
mov ebx, eax
ror eax, 2
mov ecx, ebx
ror ebx, 13
xor eax, ebx
ror ecx, 22
xor eax, ecx
mov s0, eax
}
m0 = (a & b) | (c & (a | b));
t0 = s0 + m0;
__asm{
mov eax, e
mov ebx, eax
ror eax, 6
mov ecx, ebx
ror ebx, 11
xor eax, ebx
ror ecx, 25
xor eax, ecx
mov s1, eax
}
s1 = ror(e, 6) ^ ror(e, 11) ^ ror(e, 25);
m1 = g ^ (e & (f ^ g));
w[i] = reversebytes(*(m+i));
t1 = h + s1 + m1 + k[i] + w[i];

h = g, g = f, f = e, e = d + t1, d = c, c = b, b = a, a = t0 + t1;
}
for(int i = 16; i < 64; ++i) {
ULONG s0, m0, t0, s1, m1, t1, v1, v2;
__asm{
mov eax, a
mov ebx, eax
ror eax, 2
mov ecx, ebx
ror ebx, 13
xor eax, ebx
ror ecx, 22
xor eax, ecx
mov s0, eax
}
m0 = (a & b) | (c & (a | b));
t0 = s0 + m0;
__asm{
mov eax, e
mov ebx, eax
ror eax, 6
mov ecx, ebx
ror ebx, 11
xor eax, ebx
ror ecx, 25
xor eax, ecx
mov s1, eax
}
m1 = g ^ (e & (f ^ g));

// Расширяем 16 слов в 64 слова, вычисляя дополнительные 48 слов
ULONG g1 = w[i-15], g2 = w[i-2];
__asm{
mov eax, g1
mov ebx, eax
ror eax, 7
mov ecx, ebx
ror ebx, 18
xor eax, ebx
shr ecx, 3
xor eax, ecx
mov v1, eax

mov eax, g2
mov ebx, eax
ror eax, 17
mov ecx, ebx
ror ebx, 19
xor eax, ebx
shr ecx, 10
xor eax, ecx
mov v2, eax
}
w[i] = w[i-16] + v1 + w[i-7] + v2;
t1 = h + s1 + m1 + k[i] + w[i];

h = g, g = f, f = e, e = d + t1, d = c, c = b, b = a, a = t0 + t1;
}
A += a, B += b, C += c, D += d, E += e, F += f, G += g, H += h;
}
}

// Вычисление CRC
#define CRCPOLY 0xEDB88320
#define CRCINIT 0xFFFFFFFF
#define QUANT 1024 // Читать по 1024 байт файла

static unsigned long t[256];

void inline CRCInit() // Инициализация таблицы t[]
{
int i; unsigned long x;
  for (i = 0; i <= 0xFF; i++)
      {
    x=i;
x = (x>>1) ^ (CRCPOLY & (-(signed long)(x & 1)));
x = (x>>1) ^ (CRCPOLY & (-(signed long)(x & 1)));
x = (x>>1) ^ (CRCPOLY & (-(signed long)(x & 1)));
x = (x>>1) ^ (CRCPOLY & (-(signed long)(x & 1)));

x = (x>>1) ^ (CRCPOLY & (-(signed long)(x & 1)));
x = (x>>1) ^ (CRCPOLY & (-(signed long)(x & 1)));
x = (x>>1) ^ (CRCPOLY & (-(signed long)(x & 1)));
x = (x>>1) ^ (CRCPOLY & (-(signed long)(x & 1)));
t[i] = x;
      }
}

unsigned long inline CRCCount(char* buff, DWORD bufflen)
{ // Возвращает CRC32 для буфера buff длиной bufflen
unsigned long crc = CRCINIT;
DWORD len4 = bufflen / 4;
while(len4--) {
crc = t[(crc ^ *buff++) & 0xFF] ^ (crc >> 8);
crc = t[(crc ^ *buff++) & 0xFF] ^ (crc >> 8);
crc = t[(crc ^ *buff++) & 0xFF] ^ (crc >> 8);
crc = t[(crc ^ *buff++) & 0xFF] ^ (crc >> 8);
}
bufflen %= 4;
while(bufflen--)
crc = t[(crc ^ *buff++) & 0xFF] ^ (crc >> 8);
return ~crc;
}

// ================================
// Интерфейс (диалог, WinMain etc.)
// ================================
TCHAR fn[MAX_PATH];
OPENFILENAME ofn = {sizeof(OPENFILENAME), 0, 0, TEXT("Все файлы (*.*)\0*.*"),
NULL, 0, 1, fn, sizeof(fn), 0,
MAX_PATH, 0, TEXT("Выберите файл для расчета хэша MD5"),
OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST |
OFN_EXPLORER, 0, 0, NULL, 0, NULL, 0
};
#define ERR TEXT("Файл не найден")
#define CAPTION TEXT("MD5")

int CALLBACK DialogFunc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_INITDIALOG:
SendMessage(hDlg, WM_SETICON, ICON_BIG, (WPARAM)LoadIcon(ofn.hInstance, (LPCTSTR)IDI_ICON));
SendMessage(hDlg, WM_SETICON, ICON_SMALL, (WPARAM)LoadIcon(ofn.hInstance, (LPCTSTR)IDI_ICON));
CheckDlgButton(hDlg, IDC_C, BST_CHECKED);
CheckDlgButton(hDlg, IDC_C2, BST_CHECKED);
CheckDlgButton(hDlg, IDC_C3, BST_CHECKED);
ofn.hwndOwner = hDlg;
CRCInit();
return TRUE;
case WM_COMMAND:
switch(wParam) {
case IDOK: {
ULONG A, B, C, D, E, F, G, H; ULONG len, len2; char* s; char out[64+9];
SetCursor(LoadCursor(NULL, IDC_WAIT));
SendDlgItemMessage(hDlg, IDC_TEXT, WM_GETTEXT, MAX_PATH, (WPARAM)fn);
HANDLE hFile = CreateFile(fn, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if(INVALID_HANDLE_VALUE == hFile) {
MessageBox(hDlg, ERR, CAPTION, MB_ICONERROR | MB_OK);
break;
}
len = GetFileSize(hFile, NULL);
len2 = ((len + 8 + 1) + 63) & -64; // Округление вверх
s = (char*)malloc(len2);
ReadFile(hFile, s, len, &len, NULL);
if(IsDlgButtonChecked(hDlg, IDC_C) == BST_CHECKED) {
SHA256((UCHAR*)s, len, len2, A, B, C, D, E, F, G, H);
wsprintf(out, "%08x %08x %08x %08x %08x %08x %08x %08x", A, B, C, D, E, F, G, H);
}
else
out[0] = '\0';
SendDlgItemMessage(hDlg, IDC_SHA, WM_SETTEXT, 0, (WPARAM)out);

if(IsDlgButtonChecked(hDlg, IDC_C2) == BST_CHECKED) {
MD5(s, len, len2, A, B, C, D);
A = reversebytes(A), B = reversebytes(B),
C = reversebytes(C), D = reversebytes(D);
wsprintf(out, TEXT("%08x%08x%08x%08x"), A, B, C, D);
}
else
out[0] = '\0';
SendDlgItemMessage(hDlg, IDC_HASH2, WM_SETTEXT, 0, (WPARAM)out);

if(IsDlgButtonChecked(hDlg, IDC_C3) == BST_CHECKED) {
A = CRCCount(s, len);
wsprintf(out, "%08x", A);
}
else
out[0] = '\0';
SendDlgItemMessage(hDlg, IDC_CRC, WM_SETTEXT, 0, (WPARAM)out);
CloseHandle(hFile);
free(s);
SetCursor(LoadCursor(NULL, IDC_ARROW));
break;
}
case IDCANCEL:
EndDialog(hDlg, 0);
break;
case ID_CLEAR:
if( GetOpenFileName(&ofn) )
SendDlgItemMessage(hDlg, IDC_TEXT, WM_SETTEXT, 0, (WPARAM)fn);
break;
}
break;
}
return FALSE;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,   int       nCmdShow) {
heap = GetProcessHeap();
ofn.hInstance = GetModuleHandle(NULL);
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) |
_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);
DialogBoxParam(ofn.hInstance, (LPCSTR)IDD_DIALOG1, 0, DialogFunc, 0);
ExitProcess(0);
return 0;
}


2. MD5.rc:
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Russian resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON                ICON                    "FACTORY.ICO"

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 342, 82
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
    WS_SYSMENU
CAPTION "Хэш-функции MD5 и SHA-256, контрольная сумма CRC32"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "Рассчитать",IDOK,228,61,50,14
    EDITTEXT        IDC_TEXT,55,7,223,13,ES_MULTILINE | ES_AUTOHSCROLL |
                    ES_NOHIDESEL | ES_WANTRETURN
    EDITTEXT        IDC_CRC,55,61,143,14,ES_AUTOHSCROLL | ES_READONLY
    PUSHBUTTON      "Обзор...",ID_CLEAR,285,7,50,14
    PUSHBUTTON      "Выход",IDCANCEL,285,61,50,14
    LTEXT           "Файл:",IDC_STATIC,30,8,21,8
    EDITTEXT        IDC_SHA,55,24,280,14,ES_AUTOHSCROLL | ES_READONLY
    EDITTEXT        IDC_HASH2,55,42,143,14,ES_AUTOHSCROLL | ES_READONLY
    CONTROL         "SHA-256:",IDC_C,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,
                    25,47,10
    CONTROL         "MD5:",IDC_C2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,44,
                    33,10
    CONTROL         "CRC32:",IDC_C3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,
                    62,41,10
END


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include ""windows.h""\r\n"
    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "\0"
END

3 TEXTINCLUDE
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 335
        TOPMARGIN, 7
        BOTTOMMARGIN, 75
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // Russian resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED



3. MD5.sln:
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MD5", "MD5.vcproj", "{F00F5A2C-5910-49BB-A1DE-EDCB90A878DB}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{F00F5A2C-5910-49BB-A1DE-EDCB90A878DB}.Debug.ActiveCfg = Debug|Win32
{F00F5A2C-5910-49BB-A1DE-EDCB90A878DB}.Debug.Build.0 = Debug|Win32
{F00F5A2C-5910-49BB-A1DE-EDCB90A878DB}.Release.ActiveCfg = Release|Win32
{F00F5A2C-5910-49BB-A1DE-EDCB90A878DB}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal


4. MD5.vcproj:
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="MD5"
ProjectGUID="{F00F5A2C-5910-49BB-A1DE-EDCB90A878DB}"
RootNamespace="MD5"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="2"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/MD5.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/MD5.pdb"
SubSystem="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
GlobalOptimizations="FALSE"
InlineFunctionExpansion="0"
EnableIntrinsicFunctions="FALSE"
FavorSizeOrSpeed="0"
OptimizeForWindowsApplication="FALSE"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
StringPooling="FALSE"
ExceptionHandling="FALSE"
RuntimeLibrary="4"
BufferSecurityCheck="FALSE"
UsePrecompiledHeader="2"
AssemblerOutput="4"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"
CallingConvention="1"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib"
OutputFile="$(OutDir)/MD5.exe"
LinkIncremental="1"
GenerateDebugInformation="FALSE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
OptimizeForWindows98="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath=".\MD5.cpp">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath=".\Resource.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
<File
RelativePath=".\Factory.ico">
</File>
<File
RelativePath=".\MD5.rc">
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #1
Добавлено: 16.08.05 22:47
Ой, забыл: еще Resource.h:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by MD5.rc
//
#define IDC_MYICON                      2
#define IDD_MD5_DIALOG                  102
#define IDS_APP_TITLE                   103
#define IDM_ABOUT                       104
#define IDM_EXIT                        105
#define IDC_MD5                         109
#define IDR_MAINFRAME                   128
#define IDD_DIALOG1                     129
#define IDI_ICON1                       130
#define IDI_ICON                        130
#define IDC_TEXT                        1000
#define IDC_HASH                        1001
#define IDC_CRC                         1001
#define ID_CLEAR                        1002
#define IDC_SHA                         1003
#define IDC_HASH2                       1004
#define IDC_C                           1005
#define IDC_C2                          1006
#define IDC_C3                          1007
#define IDC_STATIC                      -1

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC                     1
#define _APS_NEXT_RESOURCE_VALUE        131
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1006
#define _APS_NEXT_SYMED_VALUE           110
#endif
#endif


Помогите, плиз!

Ответить

Номер ответа: 2
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #2
Добавлено: 16.08.05 22:58
Там Ассемблерные вставки.
VB6 их криво поддерживает. Вообще говоря не поддерживает, только обходными путями.

Вообще код хорошо оптимизирован. Где ты его взял?

VB.NET не поддерживает вовсе.

Очень нудная работа.
Лучше сделяй DLL и вызывай из VB.

Ответить

Номер ответа: 3
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #3
Добавлено: 16.08.05 23:03
1. Никому с таким кол-вом кода за так возиться не охото :)
2. И второе, главное :) - многие алгоритмы, в частности MD5 и CRC точно есть на VB6 готовые... вот на счет SHA точно не знаю, но думаю что тоже имеются.

Ответить

Номер ответа: 4
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #4 Добавлено: 17.08.05 01:17
у меня всё есть (MD5, SHA, SHA 256, DES, Skipjack, TEA, Twofish, AES, Serpent, RC4, Gost, и др...) поделюсь за спасибо, кричите тут или в асю

п.с. некотрые и в инете найти можно...

Ответить

Номер ответа: 5
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #5
Добавлено: 17.08.05 01:42
да они все на vbkiev.ua есть. Там приличная свалка

Ответить

Номер ответа: 6
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #6 Добавлено: 17.08.05 01:50
незнаю, несмотрел, мне на мыло по просьбе кинули. Может это даже эти же, х.з.

Ответить

Номер ответа: 7
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 17.08.05 01:53
ну в конечном итоге они же не сам их пишут, тоже где то надыбали

Ответить

Номер ответа: 8
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #8
Добавлено: 17.08.05 10:43
HACKER, кинь, плиз!!! Очень прошу и очень нужно!
E-Mail: bdragon05@mail.ru

Ответить

Номер ответа: 9
Автор ответа:
 someone



Вопросов: 215
Ответов: 1596
 Web-сайт: 123
 Профиль | | #9
Добавлено: 17.08.05 11:24
да они все на vbkiev.ua есть. Там приличная свалка

точно что свалка... Хотя много полезного.

А есть ли проги для перевода кода с VB на C и наоборот к примеру? А то у меня есть диск с примерами на C++ и там много чего инетересного...

Ответить

Номер ответа: 10
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #10 Добавлено: 17.08.05 12:35
2 Black Dragon

ушло...

Ответить

Номер ответа: 11
Автор ответа:
 Barsik



Разработчик Offline Client

ICQ: 343368641 

Вопросов: 17
Ответов: 686
 Web-сайт: barsik.newmail.ru
 Профиль | | #11
Добавлено: 17.08.05 18:03
2HACKER:
замыль barsik[dog]n-kama[dot]ru

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 17.08.05 20:10
2 Barsik

ушло...

Ответить

Номер ответа: 13
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #13
Добавлено: 17.08.05 20:38
HACKER, принял, огромное спасибо.

Ответить

Номер ответа: 14
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #14 Добавлено: 22.08.05 22:08
ну если не опоздал, то лавите cMD5.cls:

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  ;DataBindingBehavior = 0  'vbNone
  ;DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "cMD5"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

'/******************************************************************************
' *  Copyright (C) 2000 by Robert Hubley.                                      *
' *  All rights reserved.                                                      *
' *                                                                            *
' *  This software is provided ``AS IS'' and any express or implied            *
' *  warranties, including, but not limited to, the implied warranties of      *
' *  merchantability and fitness for a particular purpose, are disclaimed.     *
' *  In no event shall the authors be liable for any direct, indirect,         *
' *  incidental, special, exemplary, or consequential damages (including, but  *
' *  not limited to, procurement of substitute goods or services; loss of use, *
' *  data, or profits; or business interruption) however caused and on any     *
' *  theory of liability, whether in contract, strict liability, or tort       *
' *  ;(including negligence or otherwise) arising in any way out of the use of  *
' *  this software, even if advised of the possibility of such damage.         *
' *                                                                            *
' ******************************************************************************
'
'  CLASS: MD5
'
'  ;DESCRIPTION:
'     This is a class which encapsulates a set of MD5 Message Digest functions.
'     MD5 algorithm produces a 128 bit digital fingerprint (signature) from an
'     dataset of arbitrary length.  For details see RFC 1321 (summarized below).
'     This implementation is derived from the RSA Data Security, Inc. MD5 Message-Digest
'     algorithm reference implementation (originally written in C)
'
'  AUTHOR:
'     Robert M. Hubley 12/1999
'
'
'  NOTES:
'      Network Working Group                                    R. Rivest
'      Request for Comments: 1321     MIT Laboratory for Computer Science
'                                             and RSA Data Security, Inc.
'                                                              April 1992
'
'
'                           The MD5 Message-Digest Algorithm
'
'      Summary
'
'         This document describes the MD5 message-digest algorithm. The
'         algorithm takes as input a message of arbitrary length and produces
'         as output a 128-bit "fingerprint" or "message digest" of the input.
'         It is conjectured that it is computationally infeasible to produce
'         two messages having the same message digest, or to produce any
'         message having a given prespecified target message digest. The MD5
'         algorithm is intended for digital signature applications, where a
'         large file must be "compressed" in a secure manner before being
'         encrypted with a private (secret) key under a public-key cryptosystem
'         such as RSA.
'
'         The MD5 algorithm is designed to be quite fast on 32-bit machines. In
'         addition, the MD5 algorithm does not require any large substitution
'         tables; the algorithm can be coded quite compactly.
'
'         The MD5 algorithm is an extension of the MD4 message-digest algorithm
'         1,2]. MD5 is slightly slower than MD4, but is more "conservative" in
'         design. MD5 was designed because it was felt that MD4 was perhaps
'         being adopted for use more quickly than justified by the existing
'         critical review; because MD4 was designed to be exceptionally fast,
'         it is "at the edge" in terms of risking successful cryptanalytic
'         attack. MD5 backs off a bit, giving up a little in speed for a much
'         greater likelihood of ultimate security. It incorporates some
'         suggestions made by various reviewers, and contains additional
'         optimizations. The MD5 algorithm is being placed in the public domain
'         for review and possible adoption as a standard.
'
'         RFC Author:
'         Ronald L.Rivest
'         Massachusetts Institute of Technology
'         Laboratory for Computer Science
'         NE43 -324545    Technology Square
'         Cambridge, MA  02139-1986
'         Phone: (617) 253-5880
'         EMail:    Rivest@ theory.lcs.mit.edu
'
'
'
'  CHANGE HISTORY:
'
'     0.1.0  RMH    1999/12/29      Original version
'
'


'=
'= Class Constants
'=
Private Const OFFSET_4 = 4294967296#
Private Const MAXINT_4 = 2147483647

Private Const S11 = 7
Private Const S12 = 12
Private Const S13 = 17
Private Const S14 = 22
Private Const S21 = 5
Private Const S22 = 9
Private Const S23 = 14
Private Const S24 = 20
Private Const S31 = 4
Private Const S32 = 11
Private Const S33 = 16
Private Const S34 = 23
Private Const S41 = 6
Private Const S42 = 10
Private Const S43 = 15
Private Const S44 = 21


'=
'= Class Variables
'=
Private State(4) As Long
Private ByteCounter As Long
Private ByteBuffer(63) As Byte

Private fbObject As Object, fbProc As String, fbpMin As Single, fbpMax As Single, fbpGrades As Long


'=
'= Class Properties
'=
Property Get RegisterA() As String
    RegisterA = State(1)
End Property

Property Get RegisterB() As String
    RegisterB = State(2)
End Property

Property Get RegisterC() As String
    RegisterC = State(3)
End Property

Property Get RegisterD() As String
    RegisterD = State(4)
End Property


'=
'= Class Functions
'=

'
' Function to quickly digest a file into a hex string
'
Public Function DigestFileToHexStr(FileName As String) As String
Dim FN As Integer, C As Long, N As Long
    FN = FreeFile
    Open FileName For Binary Access Read As #FN
    N = -Int(-LOF(FN) / 64)
    If Not fbObject Is Nothing Then CallByName fbObject, fbProc, VbMethod, fbpMin
    MD5Init
    Do While Not EOF(FN)
        Get #FN, , ByteBuffer
        C = C + 1
        If Not fbObject Is Nothing Then
          If fbpGrades > N Then
            CallByName fbObject, fbProc, VbMethod, fbpMin + (fbpMax - fbpMin) * (Loc(FN) / LOF(FN))
          Else
            If C Mod (N / fbpGrades) = 0 Then CallByName fbObject, fbProc, VbMethod, fbpMin + (fbpMax - fbpMin) * (Loc(FN) / LOF(FN))
          End If
        End If
        If Loc(FN) < LOF(FN) Then
            ByteCounter = ByteCounter + 64
            MD5Transform ByteBuffer
        End If
    Loop
    ByteCounter = ByteCounter + (LOF(FN) Mod 64)
    Close #FN
    MD5Final
    If Not fbObject Is Nothing Then CallByName fbObject, fbProc, VbMethod, fbpMax
    ;DigestFileToHexStr = GetValues
End Function

'
' Function to digest a text string and output the result as a string
' of hexadecimal characters.
'
Public Function DigestStrToHexStr(SourceString As String) As String
    MD5Init
    MD5Update Len(SourceString), StringToArray(SourceString)
    MD5Final
    ;DigestStrToHexStr = GetValues
End Function

'
' A utility function which converts a string into an array of
' bytes.
'
Private Function StringToArray(InString As String) As Byte()
    Dim I As Integer
    Dim bytBuffer() As Byte
    ReDim bytBuffer(Len(InString))
    For I = 0 To Len(InString) - 1
        bytBuffer(I) = Asc(Mid(InString, I + 1, 1))
    Next I
    StringToArray = bytBuffer
End Function

'
' Concatenate the four state vaules into one string
'
Public Function GetValues() As String
    GetValues = LongToString(State(1)) & LongToString(State(2)) & LongToString(State(3)) & LongToString(State(4))
End Function

'
' Convert a Long to a Hex string
'
Private Function LongToString(Num As Long) As String
        Dim A As Byte
        Dim b As Byte
        Dim C As Byte
        Dim D As Byte
        
        A = Num And &HFF&
        If A < 16 Then
            LongToString = "0" & Hex(A)
        Else
            LongToString = Hex(A)
        End If
                
        b = (Num And &HFF00&;) \ 256
        If b < 16 Then
            LongToString = LongToString & "0" & Hex(b)
        Else
            LongToString = LongToString & Hex(b)
        End If
        
        C = (Num And &HFF0000) \ 65536
        If C < 16 Then
            LongToString = LongToString & "0" & Hex(C)
        Else
            LongToString = LongToString & Hex(C)
        End If
        
        If Num < 0 Then
            ;D = ((Num And &H7F000000) \ 16777216) Or &H80&
        Else
            ;D = (Num And &HFF000000) \ 16777216
        End If
        
        If D < 16 Then
            LongToString = LongToString & "0" & Hex(D)
        Else
            LongToString = LongToString & Hex(D)
        End If
    
End Function

'
' Initialize the class
'   This must be called before a digest calculation is started
'
Public Sub MD5Init()
    ByteCounter = 0
    State(1) = UnsignedToLong(1732584193#)
    State(2) = UnsignedToLong(4023233417#)
    State(3) = UnsignedToLong(2562383102#)
    State(4) = UnsignedToLong(271733878#)
End Sub

'
' MD5 Final
'
Public Sub MD5Final()
    Dim dblBits As Double
    
    Dim padding(72) As Byte
    Dim lngBytesBuffered As Long
    
    padding(0) = &H80
    
    dblBits = ByteCounter * 8
    
    ' Pad out
    lngBytesBuffered = ByteCounter Mod 64
    If lngBytesBuffered <= 56 Then
        MD5Update 56 - lngBytesBuffered, padding
    Else
        MD5Update 120 - ByteCounter, padding
    End If
    
    
    padding(0) = UnsignedToLong(dblBits) And &HFF&
    padding(1) = UnsignedToLong(dblBits) \ 256 And &HFF&
    padding(2) = UnsignedToLong(dblBits) \ 65536 And &HFF&
    padding(3) = UnsignedToLong(dblBits) \ 16777216 And &HFF&
    padding(4) = 0
    padding(5) = 0
    padding(6) = 0
    padding(7) = 0
    
    MD5Update 8, padding
End Sub

'
' Break up input stream into 64 byte chunks
'
Public Sub MD5Update(InputLen As Long, InputBuffer() As Byte)
    Dim II As Integer
    Dim I As Integer
    Dim J As Integer
    Dim K As Integer
    Dim lngBufferedBytes As Long
    Dim lngBufferRemaining As Long
    Dim lngRem As Long
    
    lngBufferedBytes = ByteCounter Mod 64
    lngBufferRemaining = 64 - lngBufferedBytes
    ByteCounter = ByteCounter + InputLen
    ' Use up old buffer results first
    If InputLen >= lngBufferRemaining Then
        For II = 0 To lngBufferRemaining - 1
            ByteBuffer(lngBufferedBytes + II) = InputBuffer(II)
        Next II
        MD5Transform ByteBuffer
        
        lngRem = (InputLen) Mod 64
        ' The transfer is a multiple of 64 lets do some transformations
        For I = lngBufferRemaining To InputLen - II - lngRem Step 64
            For J = 0 To 63
                ByteBuffer(J) = InputBuffer(I + J)
            Next J
            MD5Transform ByteBuffer
        Next I
        lngBufferedBytes = 0
    Else
      I = 0
    End If
    
    ' Buffer any remaining input
    For K = 0 To InputLen - I - 1
        ByteBuffer(lngBufferedBytes + K) = InputBuffer(I + K)
    Next K
    
End Sub

'
' MD5 Transform
'
Private Sub MD5Transform(Buffer() As Byte)
    Dim X(16) As Long
    Dim A As Long
    Dim b As Long
    Dim C As Long
    Dim D As Long
    
    A = State(1)
    b = State(2)
    C = State(3)
    ;D = State(4)
    
    ;Decode 64, X, Buffer

    ' Round 1
    FF A, b, C, D, X(0), S11, -680876936
    FF D, A, b, C, X(1), S12, -389564586
    FF C, D, A, b, X(2), S13, 606105819
    FF b, C, D, A, X(3), S14, -1044525330
    FF A, b, C, D, X(4), S11, -176418897
    FF D, A, b, C, X(5), S12, 1200080426
    FF C, D, A, b, X(6), S13, -1473231341
    FF b, C, D, A, X(7), S14, -45705983
    FF A, b, C, D, X(8), S11, 1770035416
    FF D, A, b, C, X(9), S12, -1958414417
    FF C, D, A, b, X(10), S13, -42063
    FF b, C, D, A, X(11), S14, -1990404162
    FF A, b, C, D, X(12), S11, 1804603682
    FF D, A, b, C, X(13), S12, -40341101
    FF C, D, A, b, X(14), S13, -1502002290
    FF b, C, D, A, X(15), S14, 1236535329
    
    ' Round 2
    GG A, b, C, D, X(1), S21, -165796510
    GG D, A, b, C, X(6), S22, -1069501632
    GG C, D, A, b, X(11), S23, 643717713
    GG b, C, D, A, X(0), S24, -373897302
    GG A, b, C, D, X(5), S21, -701558691
    GG D, A, b, C, X(10), S22, 38016083
    GG C, D, A, b, X(15), S23, -660478335
    GG b, C, D, A, X(4), S24, -405537848
    GG A, b, C, D, X(9), S21, 568446438
    GG D, A, b, C, X(14), S22, -1019803690
    GG C, D, A, b, X(3), S23, -187363961
    GG b, C, D, A, X(8), S24, 1163531501
    GG A, b, C, D, X(13), S21, -1444681467
    GG D, A, b, C, X(2), S22, -51403784
    GG C, D, A, b, X(7), S23, 1735328473
    GG b, C, D, A, X(12), S24, -1926607734
    
    ' Round 3
    HH A, b, C, D, X(5), S31, -378558
    HH D, A, b, C, X(8), S32, -2022574463
    HH C, D, A, b, X(11), S33, 1839030562
    HH b, C, D, A, X(14), S34, -35309556
    HH A, b, C, D, X(1), S31, -1530992060
    HH D, A, b, C, X(4), S32, 1272893353
    HH C, D, A, b, X(7), S33, -155497632
    HH b, C, D, A, X(10), S34, -1094730640
    HH A, b, C, D, X(13), S31, 681279174
    HH D, A, b, C, X(0), S32, -358537222
    HH C, D, A, b, X(3), S33, -722521979
    HH b, C, D, A, X(6), S34, 76029189
    HH A, b, C, D, X(9), S31, -640364487
    HH D, A, b, C, X(12), S32, -421815835
    HH C, D, A, b, X(15), S33, 530742520
    HH b, C, D, A, X(2), S34, -995338651
    
    ' Round 4
    II A, b, C, D, X(0), S41, -198630844
    II D, A, b, C, X(7), S42, 1126891415
    II C, D, A, b, X(14), S43, -1416354905
    II b, C, D, A, X(5), S44, -57434055
    II A, b, C, D, X(12), S41, 1700485571
    II D, A, b, C, X(3), S42, -1894986606
    II C, D, A, b, X(10), S43, -1051523
    II b, C, D, A, X(1), S44, -2054922799
    II A, b, C, D, X(8), S41, 1873313359
    II D, A, b, C, X(15), S42, -30611744
    II C, D, A, b, X(6), S43, -1560198380
    II b, C, D, A, X(13), S44, 1309151649
    II A, b, C, D, X(4), S41, -145523070
    II D, A, b, C, X(11), S42, -1120210379
    II C, D, A, b, X(2), S43, 718787259
    II b, C, D, A, X(9), S44, -343485551
    
    
    State(1) = LongOverflowAdd(State(1), A)
    State(2) = LongOverflowAdd(State(2), b)
    State(3) = LongOverflowAdd(State(3), C)
    State(4) = LongOverflowAdd(State(4), D)

'  /* Zeroize sensitive information.
'*/
'  MD5_memset ((POINTER)x, 0, sizeof (x));
    
End Sub

Private Sub Decode(Length As Integer, OutputBuffer() As Long, InputBuffer() As Byte)
    Dim intDblIndex As Integer
    Dim intByteIndex As Integer
    Dim dblSum As Double
    
    intDblIndex = 0
    For intByteIndex = 0 To Length - 1 Step 4
        dblSum = InputBuffer(intByteIndex) + _
                                    InputBuffer(intByteIndex + 1) * 256# + _
                                    InputBuffer(intByteIndex + 2) * 65536# + _
                                    InputBuffer(intByteIndex + 3) * 16777216#
        OutputBuffer(intDblIndex) = UnsignedToLong(dblSum)
        intDblIndex = intDblIndex + 1
    Next intByteIndex
End Sub

'
' FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
' Rotation is separate from addition to prevent recomputation.
'
Private Function FF(A As Long, _
                    b As Long, _
                    C As Long, _
                    ;D As Long, _
                    X As Long, _
                    s As Long, _
                    ac As Long) As Long
    A = LongOverflowAdd4(A, (b And C) Or (Not (b) And D), X, ac)
    A = LongLeftRotate(A, s)
    A = LongOverflowAdd(A, b)
End Function

Private Function GG(A As Long, _
                    b As Long, _
                    C As Long, _
                    ;D As Long, _
                    X As Long, _
                    s As Long, _
                    ac As Long) As Long
    A = LongOverflowAdd4(A, (b And D) Or (C And Not (D)), X, ac)
    A = LongLeftRotate(A, s)
    A = LongOverflowAdd(A, b)
End Function

Private Function HH(A As Long, _
                    b As Long, _
                    C As Long, _
                    ;D As Long, _
                    X As Long, _
                    s As Long, _
                    ac As Long) As Long
    A = LongOverflowAdd4(A, b Xor C Xor D, X, ac)
    A = LongLeftRotate(A, s)
    A = LongOverflowAdd(A, b)
End Function

Private Function II(A As Long, _
                    b As Long, _
                    C As Long, _
                    ;D As Long, _
                    X As Long, _
                    s As Long, _
                    ac As Long) As Long
    A = LongOverflowAdd4(A, C Xor (b Or Not (D)), X, ac)
    A = LongLeftRotate(A, s)
    A = LongOverflowAdd(A, b)
End Function

'
' Rotate a long to the right
'
Function LongLeftRotate(Value As Long, Bits As Long) As Long
    Dim lngSign As Long
    Dim lngI As Long
    Bits = Bits Mod 32
    If Bits = 0 Then LongLeftRotate = Value: Exit Function
    For lngI = 1 To Bits
        lngSign = Value And &HC0000000
        Value = (Value And &H3FFFFFFF) * 2
        Value = Value Or ((lngSign < 0) And 1) Or (CBool(lngSign And _
                &H40000000) And &H80000000)
    Next
    LongLeftRotate = Value
End Function

'
' Function to add two unsigned numbers together as in C.
' Overflows are ignored!
'
Private Function LongOverflowAdd(Val1 As Long, Val2 As Long) As Long
    Dim lngHighWord As Long
    Dim lngLowWord As Long
    Dim lngOverflow As Long

    lngLowWord = (Val1 And &HFFFF&;) + (Val2 And &HFFFF&;)
    lngOverflow = lngLowWord \ 65536
    lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + ((Val2 And &HFFFF0000) \ 65536) + lngOverflow) And &HFFFF&
    LongOverflowAdd = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&;))
End Function

'
' Function to add two unsigned numbers together as in C.
' Overflows are ignored!
'
Private Function LongOverflowAdd4(Val1 As Long, Val2 As Long, val3 As Long, val4 As Long) As Long
    Dim lngHighWord As Long
    Dim lngLowWord As Long
    Dim lngOverflow As Long

    lngLowWord = (Val1 And &HFFFF&;) + (Val2 And &HFFFF&;) + (val3 And &HFFFF&;) + (val4 And &HFFFF&;)
    lngOverflow = lngLowWord \ 65536
    lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + _
                   ;((Val2 And &HFFFF0000) \ 65536) + _
                   ;((val3 And &HFFFF0000) \ 65536) + _
                   ;((val4 And &HFFFF0000) \ 65536) + _
                   lngOverflow) And &HFFFF&
    LongOverflowAdd4 = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&;))
End Function

'
' Convert an unsigned double into a long
'
Private Function UnsignedToLong(Value As Double) As Long
        If Value < 0 Or Value >= OFFSET_4 Then Error 6 ' Overflow
        If Value <= MAXINT_4 Then
          UnsignedToLong = Value
        Else
          UnsignedToLong = Value - OFFSET_4
        End If
      End Function

'
' Convert a long to an unsigned Double
'
Private Function LongToUnsigned(Value As Long) As Double
        If Value < 0 Then
          LongToUnsigned = Value + OFFSET_4
        Else
          LongToUnsigned = Value
        End If
End Function


'=
'= Class Properties
'=

Public Property Get ProgressObject() As Object
Set ProgressObject = fbObject
End Property

Public Property Set ProgressObject(ByVal NewValue As Object)
Set fbObject = Nothing
Set fbObject = NewValue
End Property

Public Property Get ProgressProc() As String
ProgressProc = fbProc
End Property

Public Property Let ProgressProc(ByVal NewValue As String)
fbProc = NewValue
End Property

Public Property Get ProgressMin() As Single
ProgressMin = fbpMin
End Property

Public Property Let ProgressMin(ByVal NewValue As Single)
fbpMin = NewValue
End Property

Public Property Get ProgressMax() As Single
ProgressMin = fbpMax
End Property

Public Property Let ProgressMax(ByVal NewValue As Single)
fbpMax = NewValue
End Property

Public Sub SetProgressProc(ByVal NewProgressObject As Object, Optional ByVal NewProgressProc As String, Optional ByVal NewProgressMin As Single = 0!, Optional ByVal NewProgressMax As Single = 1!, Optional ByVal NewProgressGrades As Long)
If NewProgressObject Is Nothing Then
  Set fbObject = Nothing
  fbProc = vbNullString
Else
  Set fbObject = Nothing
  Set fbObject = NewProgressObject
  fbProc = NewProgressProc
End If
fbpMin = NewProgressMin
fbpMax = NewProgressMax
fbpGrades = NewProgressGrades
End Sub

Private Sub Class_Initialize()
Set fbObject = Nothing
End Sub

Private Sub Class_Terminate()
Set fbObject = Nothing
End Sub


Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам