Использование CommonCrypto/CommonHMAC для шифрования некоторых данных и всегда возвращает значение null

Я попробовал следующее, чтобы зашифровать clearTextData с помощью ключа keyData. И я проверил, чтобы убедиться, что оба эти значения действительны и проходят.

NSData *keyData = [PRIVATE_KEY dataUsingEncoding:NSUTF8StringEncoding];
NSData *clearTextData = [data dataUsingEncoding:NSUTF8StringEncoding];

uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0};

CCHmacContext hmacContext;
CCHmacInit(&hmacContext, kCCHmacAlgSHA1, keyData.bytes, keyData.length);
CCHmacUpdate(&hmacContext, clearTextData.bytes, clearTextData.length);
CCHmacFinal(&hmacContext, digest);

NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];

NSLog(@"encrypted data: %@", [NSString stringWithUTF8String:[out bytes]]);

Журнал всегда возвращается с сообщением encrypted data: (null)

Любые идеи?

* ОБНОВЛЕНИЕ *

Вот примеры ключей и данных, которые я передаю:

ключ: 983745hjhgfd3454

данные: {"data":"lala","pubKey":"75948458","sig":"val"}


person xil3    schedule 22.06.2011    source источник


Ответы (1)


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

Если вы все еще хотите видеть как можно больше строки, вы можете сделать это.

NSData *output = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];

    //This is useful
NSLog(@"encrypted data: %@", output);

    //Not useful but you may be able to visualize some of the string
char *outstr = malloc(sizeof(char) * (CC_SHA1_DIGEST_LENGTH + 1));
memcpy(outstr, [output bytes], CC_SHA1_DIGEST_LENGTH);
outstr[CC_SHA1_DIGEST_LENGTH] = 0;
NSLog(@"encrypted data string: %s", outstr);
free(outstr);

И у меня также был некоторый успех со следующей строкой. (Печатает другую строку, чем указано выше)

NSLog(@"encrypted data: %@", [[[NSString alloc] initWithData:output encoding:NSISOLatin2StringEncoding] autorelease]);
person Joe    schedule 22.06.2011
comment
Спасибо, Джо - да, я понял это после того, как еще немного отладил. В итоге я сделал кодировку base64 для зашифрованных данных - таким образом, их можно представить как обычную строку, и она прекрасно их интерпретирует. Спасибо за вашу помощь :) - person xil3; 22.06.2011