Italia
DLL

md5.dll - MD5 Hashes aus Strings erstellen

 

Sven
Bader
Herunterladen

Hallo zusammen,

wieder möchte ich eine kleine DLL bereitstellen. Ab der 5. DLL erstelle ich dann eine einzelne mit allen Funktionen

Es lassen sich MD5 Prüfsummen aus Strings generieren, welche man bekanntlich per allerhand Zwecke einsetzen kann. Ich habe viel getestet bin mir aber der Stabilität und Korrektheit noch nicht 100% sicher. Ich freue mich hier also auf Feedback!

Viele Grüße
Sven



Hier ein Beispielaufruf. Es braucht eine kleine Hilfsfunktion, da Funktionsaufrufe und Rückgaben in DLL Strings nur als Adresse verarbeiten können:
declare hDll&, text$, time&
let hDll& = @UseDll("md5.dll")
ImportFunc(hDll&,"md5", "md5DLL")

Proc md5

    Parameters inputstring$
    Declare target#
    Dim target#, 33
    md5DLL(Addr(inputstring$), target#)
    Return string$(target#,0)

EndProc

Cls
time& = &gettickcount
Print "Ä:                  " + md5("Ä")
Print "ABC:                " + md5("ABC")
Print "test:               " + md5("test")
Print "Hallo Welt:         " + md5("Hallo Welt")
Print "1234567890:         " + md5("1234567890")
Print "10.000 Leerzeichen: " + md5(Space$(10000))
print (&gettickcount-time&) + "ms"
Waitinput
FreeDll hDll&
End

Oder ganz ohne DLL nativ in XProfan. Beim Compilieren in XProfan anstatt Profan2CPP müsste die Compileranweisung im "Proc md5_rl" noch entfernt werden. Das unsigned right shift <<<, ein paar | = Zuweisungen und die Tilde ~ (Bitwise Not) musste ich umschreiben, da es diese in XProfan nicht gibt. Ich basiere übrigens auf dem C++ Code von Paul Johnston  [...] 
Def md5_tilde(1) (&(1) * (-1) -1)'~
Declare md5_x&[524288], md5_hc$
'right shift unsigned >>>

Proc md5_rsu

    Parameters a&, b&
    Declare x&
    x& = a& >> b&

    whileloop 0, b&-1

        x& = setbit(x&,31-&loop,0)

    endwhile

    return x&

EndProc

Proc md5_rh

    Parameters n&
    Declare j&, s$
    s$ = ""

    Whileloop 0, 3

        j& = &loop
        s$ = s$ + Mid$(md5_hc$, ((n& >> (j&*8 + 4)) & $0F)+1,1) + Mid$(md5_hc$, ((n& >> (j&*8)) & $0F)+1,1)

    Endwhile

    return s$

EndProc

Proc md5_ad

    Parameters x&, y&
    Declare l&, m&, return&
    l& = (x& & $FFFF) + (y& & $FFFF)
    m& = (x& >> 16) + (y& >> 16) + (l& >> 16)
    return& = (m& << 16) | (l& & $FFFF)
    return return&

EndProc

Proc md5_rl

    Declare return&
     $IFDEF COMPILER
    'P2CPP: <INLINE_CPP>
    unsigned long lN = LongParam(1);
    unsigned long lC = LongParam(2);
    unsigned unsigned rr = (lN >> (32 - lC));
    lReturn = _L(((lN << lC))) | _L(rr);
    'P2CPP: </INLINE_CPP>
     $ELSE
    Parameters n&,c&
    return& = (n& << c&) | md5_rsu(n&,(32-c&))
     $ENDIF
    return return&

Endproc

Proc md5_cm

    Parameters q&,a&,b&,x&,s&,t&
    Declare return&
    return& = md5_ad(md5_rl(md5_ad(md5_ad(a&,q&),md5_ad(x&,t&)),s&),b&)
    return return&

EndProc

Proc md5_ff

    Parameters a&,b&,c&,d&,x&,s&,t&
    Declare return&
    return& = md5_cm(((b& & c&) | (md5_tilde(b&) & d&)),a&,b&,x&,s&,t&)
    return return&

EndProc

Proc md5_gg

    Parameters a&,b&,c&,d&,x&,s&,t&
    Declare return&
    return& = md5_cm((b& & d&) | (c& & md5_tilde(d&)),a&,b&,x&,s&,t&)
    return return&

EndProc

Proc md5_hh

    Parameters a&,b&,c&,d&,x&,s&,t&
    Declare return&
    return& = md5_cm(xor(xor(b&, c&), d&),a&,b&,x&,s&,t&)
    return return&

EndProc

Proc md5_ii

    Parameters a&,b&,c&,d&,x&,s&,t&
    Declare return&
    return& = md5_cm(XOR(c&, (b& | md5_tilde(d&))),a&,b&,x&,s&,t&)
    return return&

EndProc

Proc md5_sb

    Parameters x$
    Declare i&, nblk&, return&
    nblk& = ((len(x$) + 8) >> 6) + 1

    Whileloop 0, (nblk&*16 - 1)

        i& = &loop
        md5_x&[i&] = 0

    Endwhile

    Whileloop 0, (len(x$) - 1)

        i& = &loop
        md5_x&[i& >> 2] = md5_x&[i& >> 2] | (ord(Mid$(x$,i&+1,1)) << ((i& MOD 4)*8))

    Endwhile

    inc i&
    md5_x&[i& >> 2] = md5_x&[i& >> 2] | ($80 << (((i&) MOD 4)*8))
    md5_x&[nblk&*16-2] = len(x$)*8
    return& = nblk&*16
    return return&

EndProc

Proc md5

    parameters inputString$
    declare a&,b&,c&,d&,olda&,oldb&,oldc&,oldd&,i&,lenx&
    md5_hc$ = "0123456789abcdef"
    lenx& = md5_sb(inputString$)
    'messagebox str$(lenx& ),"",0
    a& = 1732584193
    b& = -271733879
    c& = -1732584194
    d& = 271733878
    '  messagebox str$(lenx&),"",0

    While i& < lenx&

        olda& = a&
        oldb& = b&
        oldc& = c&
        oldd& = d&
        a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 0], 7, -680876936)
        d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 1],12, -389564586)
        c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 2],17, 606105819)
        b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 3],22,-1044525330)
        a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 4], 7, -176418897)
        d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 5],12, 1200080426)
        c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 6],17,-1473231341)
        b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 7],22, -45705983)
        a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 8], 7, 1770035416)
        d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 9],12,-1958414417)
        c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 10],17,  -42063)
        b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 11],22,-1990404162)
        a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 12], 7, 1804603682)
        d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 13],12, -40341101)
        c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 14],17,-1502002290)
        b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 15],22, 1236535329)
        a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 1], 5, -165796510)
        d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 6], 9,-1069501632)
        c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 11],14, 643717713)
        b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 0],20, -373897302)
        a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 5], 5, -701558691)
        d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 10], 9, 38016083)
        c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 15],14, -660478335)
        b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 4],20, -405537848)
        a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 9], 5, 568446438)
        d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 14], 9,-1019803690)
        c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 3],14, -187363961)
        b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 8],20, 1163531501)
        a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 13], 5,-1444681467)
        d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 2], 9, -51403784)
        c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 7],14, 1735328473)
        b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 12],20,-1926607734)
        a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 5], 4, -378558)
        d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 8],11,-2022574463)
        c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 11],16, 1839030562)
        b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 14],23, -35309556)
        a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 1], 4,-1530992060)
        d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 4],11, 1272893353)
        c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 7],16, -155497632)
        b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 10],23,-1094730640)
        a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 13], 4, 681279174)
        d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 0],11, -358537222)
        c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 3],16, -722521979)
        b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 6],23, 76029189)
        a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 9], 4, -640364487)
        d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 12],11, -421815835)
        c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 15],16, 530742520)
        b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 2],23, -995338651)
        a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 0], 6, -198630844)
        d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 7],10, 1126891415)
        c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 14],15,-1416354905)
        b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 5],21, -57434055)
        a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 12], 6, 1700485571)
        d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 3],10,-1894986606)
        c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 10],15, -1051523)
        b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 1],21,-2054922799)
        a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 8], 6, 1873313359)
        d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 15],10, -30611744)
        c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 6],15,-1560198380)
        b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 13],21, 1309151649)
        a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 4], 6, -145523070)
        d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 11],10,-1120210379)
        c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 2],15, 718787259)
        b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 9],21, -343485551)
        a& = md5_ad(a&,olda&)
        b& = md5_ad(b&,oldb&)
        c& = md5_ad(c&,oldc&)
        d& = md5_ad(d&,oldd&)
        i& = i& + 16

    EndWhile

    Return (md5_rh(a&) + md5_rh(b&) + md5_rh(c&) + md5_rh(d&))

EndProc

cls
declare time&
time&  = &gettickcount
print "Hallo Welt: "+md5("Hallo Welt")
print "ÄÖÜ: "+md5(Utf8Encode("ÄÖÜ"))
print (&gettickcount-time&)
waitkey
end

83 kB
Hochgeladen:11.09.2021
Downloadcounter88
Herunterladen
6 kB
Hochgeladen:11.09.2021
Downloadcounter78
Herunterladen
 
11.09.2021  
 




Sven
Bader
Habs noch mal aktualisiert. Die DLL ist jetzt schneller und verarbeitet Umlaute etc. korrekt.
 
13.09.2021  
 




Sven
Bader
Ich war noch mal dran und habe die DLL aktualisiert. Es ist jetzt possibile, File zu prüfen. Das eignet sich, um beispielsweise Manipulationen oder sonstige Beschädigungen an Programmdateien zu prüfen, kann aber ein wenig dauern.
declare hDll&, text$
let hDll& = @UseDll("md5.dll")
ImportFunc(hDll&,"md5", "md5DLL")
ImportFunc(hDll&,"md5_file", "md5_fileDLL")

Proc md5

    Parameters inputstring$
    Declare target#
    Dim target#, 33
    md5DLL(Addr(inputstring$), target#)
    Return string$(target#,0)

EndProc

Proc md5_file

    Parameters inputstring$
    Declare target#
    Dim target#, 33
    md5_fileDLL(Addr(inputstring$), target#)
    Return string$(target#,0)

EndProc

Cls
declare time&
time& = &gettickcount
Print "a) Zeichenkette \qtest\q:"
Print "098f6bcd4621d373cade4e832627b4f6"
Print md5("test")
Print ""
Print "b) File md5.dll:"
Print "fa7a65f6042653776b524d829e5aef2b"
Print md5_file("md5.dll")
Print ""
Print "c) 1024 Leerzeichen:"
Print "10801b757893f9edbff42cd92fdd406a"
Print md5(space$(1024))
Print ""
Print str$(int(&gettickcount-time&)) + "ms"
Waitinput
FreeDll hDll&
End
 
24.02.2023  
 




Georg
Teles
Nabend,

per Dateiprüfung kannst Du eventuell die Funktion MapFileAndCheckSum verwenden:
DEF MapFileAndCheckSum(3) ! "Imagehlp","MapFileAndCheckSumA"

Proc crc

    Parameters File$
    Clear Headsum&, Checksum&
    MapFileAndCheckSum(Addr(File$),addr(Headsum&),addr(Checksum&))
    Return Checksum&

EndProc


oder hier  [...]  habe Io l' Quelltext gepostet, wie in Windows diese Funktion berechnet, hier der blanke Code (dauert auch beim Ausführen, als nProc corre es jedoch auch bei grande File bis 2 Gb relativ schnell, die File muss als Ganzes hineingelesen werden, eignet sich also per File, die nicht entpackt werden müssen als Bsp., das war meine Intention damals per Manipulationsschutz bzw. CheckSumme in meinem Archivierer):
Set("FileMode",0)
Assign #1,file$
OpenRW #1
BlockRead(#1,ber#,0,size&)
cr2& = cr2(ber#,size&)
Close #1

nProc cr2

    Parameters ber#,ps&
    Declare s&,res&
    s& = 0
    res& = 0

    If ps& MOD 2 = 0

        s& = (ps&\2)-1

    Else

        s& = (ps&\2)

    EndIf

    WhileLoop 0,s&

        res& = res&+word(ber#,&loop*2)

        If res& > 65534

            res& = (res&-65535)

        Endif

    EndWhile

    res& = (res&+ps&)
    Return res&

EndProc


Grüße
Georg
 
Alle Sprachen
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

25.02.2023  
 




Sven
Bader
Hallo Georg,

die MapFileAndCheckSumA Funktion ist interessant und schnell genug. Die 32 Bits lassen sich gut als Integer ablegen, die MD5 Prüfsummen von 128 Bit schleift man eher mal als String mit, die sind dann aber auch sicher nie doppelt.

Die Entwicklung der DLL war ausnahmsweise mal nicht aus Eigenbedarf, ich hatte einfach nur Divertimento daran 2 Gb würde ich damit jetzt nicht prüfen aber inzwischen gehen ca. 10 MB pro Sekunde, die MapFileAndCheckSumA ist da etwa 10x schneller, hat aber auch weniger zu tun.

Kannst du mir sagen, welchem Standard deine cr2 Funktion oder die MapFileAndCheckSum haben? Ich konnte die Ergebnisse nicht validieren, ein CRC32 bzw 16 scheint es nicht zu sein.

Grüße
Sven
 
26.02.2023  
 




Georg
Teles
Hi Sven,

gute Frage, ich kann nur soviel sagen, dass diese Funktion einen "Restwert" des WORD (2 Bytes) zur Dateigröße addiert, das Ergebnis ist dann die Checksumme:

WORD 1 und WORD 2 der File werden Addiert (also erste 2 Bytes mit den nächsten 2 Bytes), sollte der Wert gleich bzw. circa 65.535 betragen (Max. Wert des WORD), wird dieser abgezogen.

Zu diesem Rest wird das nächste WORD (2 Bytes) addiert und wieder verglichen und abgezogen, bis das Dateiende erreicht ist ... zum Schluss wird dem Ergebnis, also dem RestWORD, die Dateigröße addiert. Das Ergebnis ist dann die Summe des RestWORD und der Dateigröße.

Laut MS wurde diese Fuktion gegen Manipulation ausführbarer File entwickelt, sodass die CheckSumme direkt in den Testata der EXE File geschrieben wird (beim Kompilieren).

Bedeutet, wenn man eine EXE File mit dieser Fuktion abfragt und diese im Testata die CheckSumme besitzt, wird diese Fuktion il valore einfach auslesen und ausgeben (bzw. beim Ausführen mit der File selbst vergleichen, HeadSum mit CheckSum, ob manipuliert wurde) ... wenn die EXE File keine CheckSumme besitzt, wird diese berechnet, ein Vergleich und eine Meldung bzgl. Manipulation entfällt.

Diese Funktion kann man aber auch auf alle File anwenden, da die Berechnung ziemlich schnell geht trotz großer File.

So gesehen hat diese Funktion keine Norm nehme ich an.

Grüße
Georg
 
Alle Sprachen
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

16.03.2023  
 



Zur DLL


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

2.688 Views

Untitledvor 0 min.
Thomas Zielinski28.06.2023
Paul Glatz22.06.2023
E.T.12.06.2023
Wilfried Friebe28.05.2023
Di più...

Themeninformationen

Dieses Thema hat 2 subscriber:

Sven Bader (4x)
Georg Teles (2x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie