MD5C

Torak 14.10.05 15:09

Bruce Forcettaa muutaman MD5 summan.

 Tekstiversio  Arvo: -2 (4 ääntä)  Äänestä: +  -
// MD5C.CPP - VC7
// Bruce Forcettaa muutaman MD5 summan.
#include <iostream>
#include "md5.h"

char set[] = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
                'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
                'y', 'z', 'ä', 'ö' };

char data[9];
md5 sum;

void Loop(int level)
{
        char key[65];
       
        for(int a=0; a<sizeof(set); a++)
        {
                data[level] = set[a];
                sum.Hash(data, &key[0]);
                std::cout << data << " ";
                std::cout << key << "\n";
        }
}

int main(void)
{       
        ZeroMemory(&data, 9);


        Loop(0);

        for(int a=0; a<sizeof(set); a++)
        {
                data[0] = set[a];
                Loop(1);
        }

        for(int a=0; a<sizeof(set); a++)
        {
                data[0] = set[a];
                for(int b=0; b<sizeof(set); b++)
                {
                        data[1] = set[b];
                        Loop(2);
                }
        }
        return 0;
}
// MD5.H
#ifndef MD5_H
#define MD5_H
#include <windows.h>
#include <wincrypt.h>

class md5
{
public:
        md5(void);
        ~md5(void);     
        void md5::Hash(LPCSTR String, LPSTR Hash);
        class xmd5{};
private:
        HCRYPTPROV hProv;
        HCRYPTHASH hHash;
};
#endif
// MD5.CPP
#include "md5.h"

md5::md5(void)
{
        if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
                throw xmd5();
        }       
}

md5::~md5(void)
{
        if(hProv)
                if(!CryptReleaseContext(hProv,0))
                        throw xmd5();
}

void md5::Hash(LPCTSTR lpString, LPSTR Hash)
{
        BYTE *pbHash = NULL;
        DWORD dwHashLen;
        BYTE * pbBuffer = NULL;
        unsigned long bufLen = 0;
        BYTE bHash[0x7F];

        bufLen = lstrlen(lpString);

        if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
                throw xmd5();
        }

        if(!CryptHashData(hHash, (BYTE *)lpString, bufLen, 0)) {
                throw xmd5();
        }

        if(!CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0)) {
                throw xmd5();
        }

        *Hash = 0;
   
        for (int i=0;i<16;i++)
        {
                char temp[5];
                wsprintf(temp,"%02X", bHash[i]);
                strcat(&(*Hash),temp);
   }

        if(hHash)
                if(!CryptDestroyHash(hHash))
                        throw xmd5();
}

uffis 23:54 14.10.05 
Heti alkuun olisi voinut mainita, että toimii vain Windowsissa. Pelkkä VC7 ei mielestäni siihen riitä, koska silläkin saa aikaan koodia, jonka kääntäminen onnistuu myös muissa ympäristöissä ja muilla kääntäjillä.

Jos kerran on skandit käytössä, missä ruotsalainen o, eli å?

Luokkien nimien valinta on hieman epäonnistunut ja rikkoo yleistä ison alkukirjaimen sääntöä.

Koodia ei ole mitenkään kommentoitu.
ane 18:22 21.10.05 
uffis kirjoitti:
...ja rikkoo yleistä ison alkukirjaimen sääntöä.


Ei C++:ssa luokkien nimeämisessä mitään "yleistä sääntöä" ole koskaan ollut (toisin kuten esim. Javassa).
C++:n STL:nkin luokkien nimet ovat pienellä.
uffis 20:27 26.10.05 
Sääntö oli ehkä liian voimakas sana. Suositus tai käytäntö olisi voinut olla parempi.

Mielestäni C++:ssa on ollut ja on edelleenkin yleinen käytäntö luokkien nimien kirjoitusasusta, koska suurin osa kirjoja ja artikkeleita kirjoittavista alan ammattilaisista ehdottaa käytettäväksi luokan nimessä isoa alkukirjainta. Jos eivät ammattilaiset osaa, niin kuka sitten. Poikkeustapauksia toki on, mutta tällaisissa asioissa kannattaa kyllä yleensä seurata valtavirtaa, ellei ole todella hyvää syytä toimia toisin.

Muistan joskus kauan sitten kuulleeni perustelunkin ison alkukirjaimen käytölle. Se nojautui muistaakseni siihen, että käyttämällä luokan nimessä isoa alkukirjainta oli helpompi erottaa standardikirjaston luokat muista.
DrDeath 22:44 4.11.06 
Minun kirjassani sanottiin, että voin itse valita oman tapani, mutta sitä tulisi käyttää aina joka ohjelmassa ja niin teenkin... Ison alkukirjaimen sääntö, pöh...