Как взять md5 в Windows Mobile 5.0
От: Buggy  
Дата: 18.02.09 06:20
Оценка:
Как взять md5 в Windows Mobile 5.0? Что-то я в SDK на WM не нашел CryptoAPI.
Re: Как взять md5 в Windows Mobile 5.0
От: Buggy  
Дата: 18.02.09 06:27
Оценка:
Здравствуйте, Buggy, Вы писали:

B>Как взять md5 в Windows Mobile 5.0? Что-то я в SDK на WM не нашел CryptoAPI.

забыл написать. На VC++
Re: Как взять md5 в Windows Mobile 5.0
От: std.denis Россия  
Дата: 18.02.09 07:06
Оценка:
а готовые реализации с исходниками что, не компилируются?
Re[2]: Как взять md5 в Windows Mobile 5.0
От: pjBrain  
Дата: 18.02.09 09:02
Оценка:
Здравствуйте, Buggy, Вы писали:

B>Здравствуйте, Buggy, Вы писали:


B>>Как взять md5 в Windows Mobile 5.0? Что-то я в SDK на WM не нашел CryptoAPI.

B>забыл написать. На VC++

OS Versions: Windows CE 2.10 and later.
Header: Wincrypt.h.
Link Library: Coredll.lib.

#define MD5DIGESTLEN    16

void MakeMD5Hash(PBYTE pData, int iSize)
{
  bool fAllGood = false;
  ULONG cb = MD5DIGESTLEN;

  BYTE cHash[MD5DIGESTLEN] = { 0 };

  HCRYPTPROV hProvContext = 0;
  if (CryptAcquireContext(&hProvContext, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == TRUE)
  {
    HCRYPTHASH hHashObj = 0;
    if (CryptCreateHash(hProvContext, CALG_MD5, NULL, NULL, &hHashObj) == TRUE)
    {
      if (CryptHashData(hHashObj, pData, iSize, NULL) == TRUE)
         fAllGood = CryptGetHashParam(hHashObj, HP_HASHVAL, cHash, &cb, 0) == TRUE;
      CryptDestroyHash(hHashObj);
    }
    CryptReleaseContext(hProvContext, 0);
  }
  // cHash - результат, iSize - длина результата 
}
Re[3]: Как взять md5 в Windows Mobile 5.0
От: Buggy  
Дата: 18.02.09 10:30
Оценка:
Здравствуйте, pjBrain, Вы писали:

B>Здравствуйте, Buggy, Вы писали:


B>>Здравствуйте, Buggy, Вы писали:


B>>>Как взять md5 в Windows Mobile 5.0? Что-то я в SDK на WM не нашел CryptoAPI.

B>>забыл написать. На VC++

B>OS Versions: Windows CE 2.10 and later.

B>Header: Wincrypt.h.
B>Link Library: Coredll.lib.

B>
B>#define MD5DIGESTLEN    16

B>void MakeMD5Hash(PBYTE pData, int iSize)
B>{
B>  bool fAllGood = false;
B>  ULONG cb = MD5DIGESTLEN;

B>  BYTE cHash[MD5DIGESTLEN] = { 0 };

B>  HCRYPTPROV hProvContext = 0;
B>  if (CryptAcquireContext(&hProvContext, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == TRUE)
B>  {
B>    HCRYPTHASH hHashObj = 0;
B>    if (CryptCreateHash(hProvContext, CALG_MD5, NULL, NULL, &hHashObj) == TRUE)
B>    {
B>      if (CryptHashData(hHashObj, pData, iSize, NULL) == TRUE)
B>         fAllGood = CryptGetHashParam(hHashObj, HP_HASHVAL, cHash, &cb, 0) == TRUE;
B>      CryptDestroyHash(hHashObj);
B>    }
B>    CryptReleaseContext(hProvContext, 0);
B>  }
B>  // cHash - результат, iSize - длина результата 
B>}
B>


Спасибо за исходник
Только что-то он не толи выводит, я делаю:
MessageBox(NULL, (LPCWSTR)cHash, 0,0); выводятся мне квадратики какие-то, думаю в кодировке не той, переделал кодировку в UNICODE из CHAR в WCHAR а так закорючки какие-то.
Re[4]: Как взять md5 в Windows Mobile 5.0
От: Buggy  
Дата: 18.02.09 11:04
Оценка:
Здравствуйте, Buggy, Вы писали:

B>Здравствуйте, pjBrain, Вы писали:


B>>Здравствуйте, Buggy, Вы писали:


B>>>Здравствуйте, Buggy, Вы писали:


B>>>>Как взять md5 в Windows Mobile 5.0? Что-то я в SDK на WM не нашел CryptoAPI.

B>>>забыл написать. На VC++

B>>OS Versions: Windows CE 2.10 and later.

B>>Header: Wincrypt.h.
B>>Link Library: Coredll.lib.

B>>
B>>#define MD5DIGESTLEN    16

B>>void MakeMD5Hash(PBYTE pData, int iSize)
B>>{
B>>  bool fAllGood = false;
B>>  ULONG cb = MD5DIGESTLEN;

B>>  BYTE cHash[MD5DIGESTLEN] = { 0 };

B>>  HCRYPTPROV hProvContext = 0;
B>>  if (CryptAcquireContext(&hProvContext, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == TRUE)
B>>  {
B>>    HCRYPTHASH hHashObj = 0;
B>>    if (CryptCreateHash(hProvContext, CALG_MD5, NULL, NULL, &hHashObj) == TRUE)
B>>    {
B>>      if (CryptHashData(hHashObj, pData, iSize, NULL) == TRUE)
B>>         fAllGood = CryptGetHashParam(hHashObj, HP_HASHVAL, cHash, &cb, 0) == TRUE;
B>>      CryptDestroyHash(hHashObj);
B>>    }
B>>    CryptReleaseContext(hProvContext, 0);
B>>  }
B>>  // cHash - результат, iSize - длина результата 
B>>}
B>>


B>Спасибо за исходник

B>Только что-то он не толи выводит, я делаю:
B>MessageBox(NULL, (LPCWSTR)cHash, 0,0); выводятся мне квадратики какие-то, думаю в кодировке не той, переделал кодировку в UNICODE из CHAR в WCHAR а так закорючки какие-то.

iSize — длина результата. Мне кажется не iSize, а наверное cb.
Помогите, я сделал для вывода следущее:

wchar_t *hash = new wchar_t;
  wchar_t *hash2 = new wchar_t[40];
  for(int loop=0; loop<cb; loop++)
  {
    _itow(cHash[loop], hash, 16);
    wcscat(hash2, hash);
  }
    MessageBox(NULL, hash2, 0,0);

Вначале появляются квадратики и только потом хэш. Как их убрать?
Re[5]: Как взять md5 в Windows Mobile 5.0
От: Buggy  
Дата: 18.02.09 11:13
Оценка:
Сделал пустяк оказался по невнимательности..

Токо вот почему-то у меня там 31 цифорка-буковка а должно быть 32. Сверил с командой md5 -s buggy в Unix там выводит:
f213f9ec3b95a60f10ded0275b8f14ac а у меня выводит
f213f9ec3b95a6f10ded0275b8f14ac где пропуск равен
f213f9ec3b95a6 f10ded0275b8f14ac где пробел.. почему? вроде по BYTE последовательно прохожу..
Re[6]: Как взять md5 в Windows Mobile 5.0
От: Buggy  
Дата: 18.02.09 11:21
Оценка:
Здравствуйте, Buggy, Вы писали:

B>Сделал пустяк оказался по невнимательности..


B>Токо вот почему-то у меня там 31 цифорка-буковка а должно быть 32. Сверил с командой md5 -s buggy в Unix там выводит:

B>f213f9ec3b95a60f10ded0275b8f14ac а у меня выводит
B>f213f9ec3b95a6f10ded0275b8f14ac где пропуск равен
B>f213f9ec3b95a6 f10ded0275b8f14ac где пробел.. почему? вроде по BYTE последовательно прохожу..

т.е он 0f сделал просто f
Re[6]: Как взять md5 в Windows Mobile 5.0
От: pjBrain  
Дата: 18.02.09 12:26
Оценка:
Здравствуйте, Buggy, Вы писали:

B>Сделал пустяк оказался по невнимательности..


B>Токо вот почему-то у меня там 31 цифорка-буковка а должно быть 32. Сверил с командой md5 -s buggy в Unix там выводит:

B>f213f9ec3b95a60f10ded0275b8f14ac а у меня выводит
B>f213f9ec3b95a6f10ded0275b8f14ac где пропуск равен
B>f213f9ec3b95a6 f10ded0275b8f14ac где пробел.. почему? вроде по BYTE последовательно прохожу..

Я привожу к читабельному виду так:
CString ArrayToHEX(BYTE* pData, int iSize)
{
  const WCHAR achHex[] = L"0123456789ABCDEF";

  CString szHEX;
  if (iSize && pData)
  {
    PWSTR pszHEX = szHEX.GetBuffer(iSize << 1);
    int iPos = 0;
    int iOutPos = 0;
    while (iPos < iSize)
    {
      BYTE b = pData[iPos++];            
      pszHEX[iOutPos++] = achHex[(b >> 4) & 0x0f];
      pszHEX[iOutPos++] = achHex[b & 0x0f];
    }
    szHEX.ReleaseBuffer();
  }
  return szHEX;
}