Как создать SHA256 и CRC32 в IOS - PullRequest
       9

Как создать SHA256 и CRC32 в IOS

8 голосов
/ 25 февраля 2012

Я занимаюсь загрузкой файлов.Я хочу создать хэши SHA256 и CRC32.Может ли кто-нибудь помочь мне, как я могу создать этот хэш?Я хочу, чтобы это работало для iOS.

Ответы [ 4 ]

32 голосов
/ 25 февраля 2012

SHA256 доступен в CommonCrypto.CRC32 не хэш, это Циклические Redundancy Check

1002 * Пример кода:.
#import <CommonCrypto/CommonDigest.h>

NSData *dataIn = [@"Now is the time for all good computers to come to the aid of their masters." dataUsingEncoding:NSASCIIStringEncoding];
NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];

CC_SHA256(dataIn.bytes, dataIn.length,  macOut.mutableBytes);

NSLog(@"dataIn: %@", dataIn);
NSLog(@"macOut: %@", macOut);

NSLog выход:
DataIN: <4e6f7720 69732074 68652074 696d6520 666f7220 616c6c20 676f6f64 20636f6d 70757465 72732074 6f20636f6d652074 6f207468 65206169 64206f66 20746865 6972206d 61737465 72732e>

macOut: <53f89cf6 7ebfbe56 89f1f76a 3843dfd1 09d68c5b a938dcd2 9a12004b 10829

2 голосов
/ 03 октября 2013

Для обоих из них вы можете использовать эту суть:

https://gist.github.com/paul-delange/6808278

И пример

NSString* crc32 = (__bridge NSString*)TGDFileHashCreateWithPath((__bridge CFStringRef)filepath, TGDFileHashDefaultChunkSizeForReadingData, TGDChecksumAlgorithmCRC32);
1 голос
/ 04 октября 2016

Этот метод сгенерирует crc32c, используемый gcloud на iOS из пути к файлу.Если вы хотите, чтобы стандарт crc32 просто раскомментировал другое значение для CRC32_POLYNOMIAL.

Он считывает файл, указанный в блоках по 512 КБ, поэтому может использоваться для больших файлов.

- (NSString*) crc32c:(NSString*)filepath{

    ///  using crc code from
    //   http://classroomm.com/objective-c/index.php?action=printpage;topic=2891.0
    //   by rgronlie


    //this is the standard crc32 polynomial
    //uint32_t CRC32_POLYNOMIAL = 0xEDB88320;

    //this is the crc32c one
    uint32_t CRC32_POLYNOMIAL = 0x82F63B78L;
    uint32_t  CRC32C_SEED = 0xFFFFFFFFL;

    // create and populate a lookup table
    uint32_t* pCRCTable = malloc(sizeof(uint32_t) * 256);

    for (uint32_t i = 0; i <= 255; i++)
    {
        uint32_t crc32 = i;
        for (uint32_t j = 8; j > 0; j--)
        {
            if ((crc32 & 1) == 1)
                crc32 = (crc32 >> 1) ^ CRC32_POLYNOMIAL;
            else
                crc32 >>= 1;
        }
        pCRCTable[i] = crc32;
    }

    // get a handle to the file
    NSFileHandle *filehandle = [NSFileHandle fileHandleForReadingAtPath:filepath];

    if(filehandle == NULL){
        NSLog(@"failed to create file handle");
        return nil;
    }

    // a buffer to read into
    NSData* databuffer;

    uint32_t crc = CRC32C_SEED;

    // read the file in chunks of 512KB

    while(true){
        databuffer = [filehandle readDataOfLength: 512 * 1024];

        // if there is nothing left finish
        if([databuffer length] == 0){
            break;
        }
        // otherwise run each chunk through the lookup table
        uint8_t *pBytes = (uint8_t *)[databuffer bytes];
        uint32_t length = [databuffer length];

        while (length--)
        {
            crc = (crc>>8) ^ pCRCTable[(crc & 0xFF) ^ *pBytes++];
        }
    }

    // clean up
    [filehandle closeFile];
    free(pCRCTable);

    // this is the result
    uint32_t hash = crc ^ 0xFFFFFFFFL;

    // reverse it for endianness
    uint32_t hash_reversed = CFSwapInt32HostToBig(hash);
    // as raw bytes
    NSData* hash_data = [NSData dataWithBytes: &hash_reversed length: sizeof(hash_reversed)];
    // return base64 encoded
    return [hash_data base64EncodedStringWithOptions:0];
}
0 голосов
/ 25 февраля 2012

нет приложений, которые могут генерировать хэш для ios

Это должно работать .... его для Mac

http://itunes.apple.com/us/app/digiprint/id473233587?mt=12

...