Objective C: SHA1

Как делают меня sha1 строка или набор чисел в Цели c?

30
задан James 12 August 2010 в 13:44
поделиться

2 ответа

В CommonCrypto (фреймворк Apple) есть функции для вычисления SHA-1 хэшей, включая одношаговый хэш:

#include <CommonCrypto/CommonDigest.h>

unsigned char digest[CC_SHA1_DIGEST_LENGTH];
NSData *stringBytes = [someString dataUsingEncoding: NSUTF8StringEncoding]; /* or some other encoding */
if (CC_SHA1([stringBytes bytes], [stringBytes length], digest)) {
    /* SHA-1 hash has been calculated and stored in 'digest'. */
    ...
}

Для набора чисел, предположим, имеется в виду массив целых чисел известной длины. Для таких данных проще итеративно построить дайджест, чем использовать одношаговую функцию:

unsigned char digest[CC_SHA1_DIGEST_LENGTH];
uint32_t *someIntegers = ...;
size_t numIntegers = ...;

CC_SHA1_CTX ctx;
CC_SHA1_Init(&ctx);
{
    for (size_t i = 0; i < numIntegers; i++)
        CC_SHA1_Update(&ctx, someIntegers + i, sizeof(uint32_t));
}
CC_SHA1_Final(digest, &ctx);

/* SHA-1 hash has been calculated and stored in 'digest'. */
...

Обратите внимание, что здесь не учитывается эндианальность. SHA-1, вычисленный с помощью этого кода на системе PowerPC, будет отличаться от вычисленного на системе i386 или ARM. Решение простое - поменяйте байты целых чисел на известную эндианальность перед вычислением:

    for (size_t i = 0; i < numIntegers; i++) {
        uint32_t swapped = CFSwapInt32HostToLittle(someIntegers[i]); /* or HostToBig */
        CC_SHA1_Update(&ctx, &swapped, sizeof(swapped));
    }
64
ответ дан 27 November 2019 в 23:29
поделиться

SHA1 фактически не поставляется с Objective-C. Вы можете использовать исходный код C для hashdeep и его друзей, который находится под лицензией в общественном достоянии (потому что он был написан сотрудником правительства США): http: //md5deep.sourceforge .net / .

2
ответ дан 27 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: