Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Вниз

Алгоритм MD5   Найти похожие ветки 

 
Wolfram ©   (2006-03-06 14:22) [0]

Подскажите пожалуйста, где можно взять реализацию алгоритма MD5 на Object Pascal или подробное его описание.


 
Джо ©   (2006-03-06 14:23) [1]

Google md5.pas — в первых же строках найдешь искомое.


 
stone ©   (2006-03-06 14:23) [2]

http://www.fichtner.net/delphi/md5.delphi.phtml


 
Vlad ©   (2006-03-06 14:24) [3]

http://kladovka.net.ru/delphibase/?action=viewfunc&topic=mathcode&id=10243


 
Jeer ©   (2006-03-06 14:30) [4]

Wolfram ©   (06.03.06 14:22)

Бери реализацию, лучше :)


 
Карелин Артем ©   (2006-03-06 15:11) [5]

torry.net - там больше


 
Reindeer Moss Eater ©   (2006-03-06 17:51) [6]

Всего-то заюзать 6 функций из advapi32.dll

CryptAcquireContext(...);
CryptCreateHash(...);
CryptHashData(...);
CryptGetHashParam(...);
CryptDestroyHash(...);
CryptReleaseContext(...);


 
Jeer ©   (2006-03-06 17:58) [7]

Reindeer Moss Eater ©   (06.03.06 17:51) [6]

"Зачем так много непонятного, когда мир гораздо проще" (С)


 
Reindeer Moss Eater ©   (2006-03-06 18:08) [8]

Зачем утяжелять проект реализацией MD5 на паскале, когда её реализация лежит буквально под ногами?
Никто же не ищет реализацию GetComputerName на Паскале.


 
Jeer ©   (2006-03-06 18:19) [9]

Reindeer Moss Eater ©   (06.03.06 18:08) [8]


> Никто же не ищет реализацию GetComputerName на Паскале.
>


Ну почему же ?
Чиста в учебных паскалевых терминах:))


 
Reindeer Moss Eater ©   (2006-03-06 19:44) [10]

Хотя с точки зрения двуплатформенности на паскале все же универсальнее


 
Карелин Артем ©   (2006-03-06 20:01) [11]


> Reindeer Moss Eater ©   (06.03.06 19:44) [10]

Пачему двуплатформенности? Уже вроде как триплатформенности, если не четыреплатформенности :)))))
(Delphi, Kylix, BDS и может даже FP)


 
Reindeer Moss Eater ©   (2006-03-06 22:39) [12]

Для BDS и .Net (если под третьей платформой подразумевалось это) это не актуально. Там есть такие же встроенные средства, как и Windows.


 
palva ©   (2006-03-07 00:06) [13]

> Зачем утяжелять проект реализацией MD5 на паскале, когда её реализация лежит буквально под ногами?

Если это нужно лишь для того, чтобы проверить целостность файла, тогда возможно. А если это связано с безопасностью или большими суммами денег?

У меня постепенно сложилось такое, может быть ошибочное, мнение, что все что связано с безопасностью должно быть предоставлено разрабочиком только вместе с исходниками. Если я сам (или нанятый мною специалист) проверил и откомпилировал эти исходники, то результатом компиляции можно пользоваться. Я бы вообще такие работы выполнял под DOS, не говоря уже об использовании Microsoft Crypto Provider.

Интересно, используют ли шифровальные средства Windows серьезные конторы типа банков. Алгоритмы там заявлены серьезные, но есть ли доверие к реализации?


 
Eraser ©   (2006-03-07 00:29) [14]


> palva ©   (07.03.06 00:06) [13]

думаю не менее серьёзные конторы используют системы от майкрософт в качестве серверов, значит доверие есть.


 
Reindeer Moss Eater ©   (2006-03-07 09:17) [15]

palva ©
А как связана большая сумма денег с MD5?
И чем таким MD5 от файла с большими деньгами, вычисленная на паскале в дос"е, отличается от такой же, вычисленной криптопровайдером?


 
Карелин Артем ©   (2006-03-07 09:37) [16]


> palva ©   (07.03.06 00:06) [13]


> У меня постепенно сложилось такое, может быть ошибочное,
>  мнение, что все что связано с безопасностью должно быть
> предоставлено разрабочиком только вместе с исходниками.
>

Это одно из требований для сертификации криптоалгоритмов в "органах".

>  Алгоритмы там заявлены серьезные, но есть ли доверие к
> реализации?

Поинтересуйся на досуге классом защищенности Windows и наличием российских сертификатов на использование криптографии.

> Eraser ©   (07.03.06 00:29) [14]
>
> > palva ©   (07.03.06 00:06) [13]
>
> думаю не менее серьёзные конторы используют системы от майкрософт
> в качестве серверов, значит доверие есть.

А вот сервера на основе M$ не менее серьезным конторам использовать нельзя! Не тот класс защищенности.


 
Jeer ©   (2006-03-07 10:00) [17]

Карелин Артем ©   (07.03.06 09:37) [16]


> серьезным конторам использовать нельзя


Их и не используют, такие сервера.


 
palva ©   (2006-03-07 12:37) [18]

> Reindeer Moss Eater ©   (07.03.06 09:17) [15]
> А как связана большая сумма денег с MD5?

А что не могут быть связаны? Ну, пофантазирую. Например, я посылаю сведения о коде снятия денег в дочерний офис. Сообщение я шифровал ГОСТом, но для получения ключа я почему-то хэшировал кодовое предложение алгоритмом MD5 от Microsoft. В результате мощность пространства ключей снизилась до того, что стало возможно получить его перебором. Операционные системы у нас одинаковые и мы успешно расшифровали сообщение, но деньги уже были сняты.

> И чем таким MD5 от файла с большими деньгами, вычисленная на паскале в дос"е, отличается от такой же, вычисленной криптопровайдером?

А разве не отличается? Тогда мне потребуются доказательства. Предъявите исходники, чтобы я сам мог изготовить соответствующие dll. А то ведь настанет час X, и будет отличаться. GPS во время войны в Ираке тоже стала сильно ошибаться. Вы не ходили по лесу во время войны в Ираке? Я ходил. В показания вносилась сильная погрешность, которая была постоянна и менялась, по-моему, каждые 20 минут.


 
Reindeer Moss Eater ©   (2006-03-07 13:02) [19]

но для получения ключа я почему-то хэшировал кодовое предложение алгоритмом MD5 от Microsoft. В результате мощность пространства ключей снизилась до того, что стало возможно получить его перебором.

А разве не отличается? Тогда мне потребуются доказательства.

В том то и дело, что не отличаются ни на пол бита.

А уязвимости самого MD5 как математического алгоритма никак не связаны с его конкретной реализацией.


 
Reindeer Moss Eater ©   (2006-03-07 13:07) [20]

Вот для теста.

Сама функция:
function CalcMD5(const AString : string) : string;
var hProv : HCRYPTPROV; hHash : HCRYPTHASH;
   pBuff,p : PByte; i,ALen : Cardinal;
begin
Result := ""; pBuff := nil;
if CryptAcquireContext(@hProv,nil,nil,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT) then
 try
  if CryptCreateHash(hProv,CALG_MD5,0,0,@hHash) then
   begin
    if CryptHashData(hHash,@AString[1],Length(AString),0) then
     begin
      if CryptGetHashParam(hHash,HP_HASHVAL,nil,@ALen,0) then
       begin
        GetMem(pBuff,ALen);
        p := pBuff;
        if CryptGetHashParam(hHash,HP_HASHVAL,pBuff,@ALen,0) then
         for i := 1 to ALen do
          begin
           Result := Result + IntToHex(p^,2);
           Inc(p);
          end;
       end;
     end;
   end;
 finally
  if Assigned(pBuff) then FreeMem(pBuff,ALen);
  CryptDestroyHash(hHash);
  CryptReleaseContext(hProv,0);
 end;
end;


Необходимые объявления, если нет интерфесного модуля к CryptoAPI 2.0:

const
PROV_RSA_FULL       = 1;
CRYPT_VERIFYCONTEXT = 4026531840;
CALG_MD5            = 32771;
HP_HASHVAL          = 2;
ADVAPI32            = "advapi32.dll";

type
 HCRYPTPROV  = ULONG;
 PHCRYPTPROV = ^HCRYPTPROV;
 HCRYPTHASH  = ULONG;
 PHCRYPTHASH = ^HCRYPTHASH;
 ALG_ID      = ULONG;
 HCRYPTKEY   = ULONG;
 PHCRYPTKEY  = ^HCRYPTKEY;

function CryptAcquireContext(phProv       :PHCRYPTPROV;
                            pszContainer :PAnsiChar;
                            pszProvider  :PAnsiChar;
                            dwProvType   :DWORD;
                            dwFlags      :DWORD) :BOOL; stdcall; external ADVAPI32 name "CryptAcquireContextA";
function CryptReleaseContext(hProv        : HCRYPTPROV;
                            dwFlags      : DWORD) : BOOL; stdcall; external ADVAPI32 name "CryptReleaseContext";
function CryptCreateHash(hProv   :HCRYPTPROV;
                        Algid   :ALG_ID;
                        hKey    :HCRYPTKEY;
                        dwFlags :DWORD;
                        phHash  :PHCRYPTHASH) :BOOL;stdcall; external ADVAPI32 name "CryptCreateHash";

function CryptHashData(hHash       :HCRYPTHASH;
                const pbData      :PBYTE;
                      dwDataLen   :DWORD;
                      dwFlags     :DWORD) :BOOL;stdcall; external ADVAPI32 name "CryptHashData";

function CryptGetHashParam(hHash      :HCRYPTHASH;
                          dwParam    :DWORD;
                          pbData     :PBYTE;
                          pdwDataLen :PDWORD;
                          dwFlags    :DWORD) :BOOL;stdcall; external ADVAPI32 name "CryptGetHashParam";


Если значение MD5 будет отличаться от вычисленного в любой другой реализации, я готов поверить в то, что в военное время значение синуса может доходить до трех.


 
palva ©   (2006-03-07 14:10) [21]

Reindeer Moss Eater ©   (07.03.06 13:07) [20]
Я честно пытался донести до вас свою мысль. К сожалению, не удалось.


 
Reindeer Moss Eater ©   (2006-03-07 14:57) [22]

В чем мысль-то?
Есть некие данные.
Есть алгоритм.
Есть его несколько реализаций, которые дают на выходе одни и те же выходные данные для одинаковых входных данных.

О чем мудреж-то?


 
Reindeer Moss Eater ©   (2006-03-07 15:02) [23]

Вот есть строка "palva"
Все криптопровайдеры, имеющиеся в моей винде (16 штук) дают значение MD5("palva"), равное

0CAE258EE53C72E5EF74E093B8CFE04B

В чем была мысль которая до меня не дошла?


 
Loginov Dmitry ©   (2006-03-07 16:19) [24]

Весь md5 в одной функции:

function TLDSfunc.md5(s: string): string;
var
 a:array[0..15] of byte;
 i:integer;
 LenHi, LenLo: longword;
 Index: DWord;
 HashBuffer: array[0..63] of byte;
 CurrentHash: array[0..3] of DWord;

 procedure Burn;
 begin
   LenHi:= 0; LenLo:= 0;
   Index:= 0;
   FillChar(HashBuffer,Sizeof(HashBuffer),0);
   FillChar(CurrentHash,Sizeof(CurrentHash),0);
 end;

 procedure Init;
 begin
   Burn;
   CurrentHash[0]:= $67452301;
   CurrentHash[1]:= $efcdab89;
   CurrentHash[2]:= $98badcfe;
   CurrentHash[3]:= $10325476;
 end;

 function LRot32(a, b: longword): longword;
 begin
   Result:= (a shl b) or (a shr (32-b));
 end;

procedure Compress;
var
  Data: array[0..15] of dword;
  A, B, C, D: dword;
begin
  Move(HashBuffer,Data,Sizeof(Data));
  A:= CurrentHash[0];
  B:= CurrentHash[1];
  C:= CurrentHash[2];
  D:= CurrentHash[3];

  A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[ 0] + $d76aa478,7);
  D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[ 1] + $e8c7b756,12);
  C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[ 2] + $242070db,17);
  B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[ 3] + $c1bdceee,22);
  A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[ 4] + $f57c0faf,7);
  D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[ 5] + $4787c62a,12);
  C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[ 6] + $a8304613,17);
  B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[ 7] + $fd469501,22);
  A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[ 8] + $698098d8,7);
  D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[ 9] + $8b44f7af,12);
  C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[10] + $ffff5bb1,17);
  B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[11] + $895cd7be,22);
  A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[12] + $6b901122,7);
  D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[13] + $fd987193,12);
  C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[14] + $a679438e,17);
  B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[15] + $49b40821,22);

  A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[ 1] + $f61e2562,5);
  D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[ 6] + $c040b340,9);
  C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[11] + $265e5a51,14);
  B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[ 0] + $e9b6c7aa,20);
  A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[ 5] + $d62f105d,5);
  D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[10] + $02441453,9);
  C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[15] + $d8a1e681,14);
  B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[ 4] + $e7d3fbc8,20);
  A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[ 9] + $21e1cde6,5);
  D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[14] + $c33707d6,9);
  C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[ 3] + $f4d50d87,14);
  B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[ 8] + $455a14ed,20);
  A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[13] + $a9e3e905,5);
  D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[ 2] + $fcefa3f8,9);
  C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[ 7] + $676f02d9,14);
  B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[12] + $8d2a4c8a,20);

  A:= B + LRot32(A + (B xor C xor D) + Data[ 5] + $fffa3942,4);
  D:= A + LRot32(D + (A xor B xor C) + Data[ 8] + $8771f681,11);
  C:= D + LRot32(C + (D xor A xor B) + Data[11] + $6d9d6122,16);
  B:= C + LRot32(B + (C xor D xor A) + Data[14] + $fde5380c,23);
  A:= B + LRot32(A + (B xor C xor D) + Data[ 1] + $a4beea44,4);
  D:= A + LRot32(D + (A xor B xor C) + Data[ 4] + $4bdecfa9,11);
  C:= D + LRot32(C + (D xor A xor B) + Data[ 7] + $f6bb4b60,16);
  B:= C + LRot32(B + (C xor D xor A) + Data[10] + $bebfbc70,23);
  A:= B + LRot32(A + (B xor C xor D) + Data[13] + $289b7ec6,4);
  D:= A + LRot32(D + (A xor B xor C) + Data[ 0] + $eaa127fa,11);
  C:= D + LRot32(C + (D xor A xor B) + Data[ 3] + $d4ef3085,16);
  B:= C + LRot32(B + (C xor D xor A) + Data[ 6] + $04881d05,23);
  A:= B + LRot32(A + (B xor C xor D) + Data[ 9] + $d9d4d039,4);
  D:= A + LRot32(D + (A xor B xor C) + Data[12] + $e6db99e5,11);
  C:= D + LRot32(C + (D xor A xor B) + Data[15] + $1fa27cf8,16);
  B:= C + LRot32(B + (C xor D xor A) + Data[ 2] + $c4ac5665,23);

  A:= B + LRot32(A + (C xor (B or (not D))) + Data[ 0] + $f4292244,6);
  D:= A + LRot32(D + (B xor (A or (not C))) + Data[ 7] + $432aff97,10);
  C:= D + LRot32(C + (A xor (D or (not B))) + Data[14] + $ab9423a7,15);
  B:= C + LRot32(B + (D xor (C or (not A))) + Data[ 5] + $fc93a039,21);
  A:= B + LRot32(A + (C xor (B or (not D))) + Data[12] + $655b59c3,6);
  D:= A + LRot32(D + (B xor (A or (not C))) + Data[ 3] + $8f0ccc92,10);
  C:= D + LRot32(C + (A xor (D or (not B))) + Data[10] + $ffeff47d,15);
  B:= C + LRot32(B + (D xor (C or (not A))) + Data[ 1] + $85845dd1,21);
  A:= B + LRot32(A + (C xor (B or (not D))) + Data[ 8] + $6fa87e4f,6);
  D:= A + LRot32(D + (B xor (A or (not C))) + Data[15] + $fe2ce6e0,10);
  C:= D + LRot32(C + (A xor (D or (not B))) + Data[ 6] + $a3014314,15);
  B:= C + LRot32(B + (D xor (C or (not A))) + Data[13] + $4e0811a1,21);
  A:= B + LRot32(A + (C xor (B or (not D))) + Data[ 4] + $f7537e82,6);
  D:= A + LRot32(D + (B xor (A or (not C))) + Data[11] + $bd3af235,10);
  C:= D + LRot32(C + (A xor (D or (not B))) + Data[ 2] + $2ad7d2bb,15);
  B:= C + LRot32(B + (D xor (C or (not A))) + Data[ 9] + $eb86d391,21);

  Inc(CurrentHash[0],A);
  Inc(CurrentHash[1],B);
  Inc(CurrentHash[2],C);
  Inc(CurrentHash[3],D);
  Index:= 0;
  FillChar(HashBuffer,Sizeof(HashBuffer),0);
end;

procedure Update(const Buffer; Size: longword);
var
 PBuf: ^byte;
begin
  Inc(LenHi,Size shr 29);
  Inc(LenLo,Size*8);
  if LenLo< (Size*8) then
    Inc(LenHi);

  PBuf:= @Buffer;
  while Size> 0 do
  begin
   if (Sizeof(HashBuffer)-Index)<= DWord(Size) then
   begin
     Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index);
     Dec(Size,Sizeof(HashBuffer)-Index);
     Inc(PBuf,Sizeof(HashBuffer)-Index);
     Compress;
   end
   else
   begin
     Move(PBuf^,HashBuffer[Index],Size);
     Inc(Index,Size);
     Size:= 0;
   end;
  end;
end;

procedure Final(var Digest);
begin
  HashBuffer[Index]:= $80;
  if Index>= 56 then Compress;
  PDWord(@HashBuffer[56])^:= LenLo;
  PDWord(@HashBuffer[60])^:= LenHi;
  Compress;
  Move(CurrentHash,Digest,Sizeof(CurrentHash));
  Burn;
end;

begin
 Init;
 Update(s[1],Length(s));
 Final(a);
 result:="";
 for i:=0 to 15 do
   result:=result+IntToHex(a[i],2);
 Burn;
end;  


 
Тень коня Буденного   (2006-03-07 17:10) [25]


> Reindeer Moss Eater ©   (07.03.06 15:02) [23]

Не спорь с Де Биллами, а то разница между вами со стороны не всем видна. Да и надо оно тебе? Пусть пользуют собственные велосипеды с перпендикулярными колесами, нам же проще будет.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.049 c
2-1142618474
Fenix
2006-03-17 21:01
2006.04.02
Траблы с типами...


2-1142848749
Ivanov
2006-03-20 12:59
2006.04.02
Работа с клавиатурой.


2-1142493748
KyRo
2006-03-16 10:22
2006.04.02
Доступ к файлу


4-1136860021
Beduir
2006-01-10 05:27
2006.04.02
Аналог TPanel


2-1142597681
nyron
2006-03-17 15:14
2006.04.02
помогите плиз с excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский