2

私は HMAC-SHA256 エンコーディングを行っています。試しましたが、解決策が見つかりませんでした。

#include <CommonCrypto/CommonHMAC.h>

- (NSString *)hmacWithKey:(NSString *)key andData:(NSString *)data
{
const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

///////////////////////////////////////////////////////////////
////but on below line of code i am getting EXC_BAD_ACCESS//////
///////////////////////////////////////////////////////////////

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

//////////////////////////////////////////////

NSData *out = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH];

// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
// hash is now a string with just the 40char hash value in it
NSLog(@"%@",hash);
return hash;
}

私がここで何をしているのか教えてください。ありがとう

4

2 に答える 2

9

cStringUsingEncoding:NSASCIIStringEncodingNULL文字列に非 ASCII 文字が含まれている場合に返すことができます。cKey == NULLしたがって、またはかどうかを確認する必要がありますcData == NULL

または、UTF-8 文字列に変換します。

const char *cKey  = [key UTF8String];
const char *cData = [data UTF8String];
于 2013-11-10T09:04:11.193 に答える
1

エラーなしでサンプル文字列を使用してOPコードを実行したため、エラーは入力に含まれている必要があります。1 つ以上の入力が nil または非 ASCII です。

失敗するサンプル入力を提供してください。

ところで、char 文字列を使用する必要はありません。NSData を使用した例を次に示します。

NSData *cKey  = [key  dataUsingEncoding:NSUTF8StringEncoding];
NSData *cData = [data dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *out = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA256, cKey.bytes, cKey.length, cData.bytes, cData.length, out.mutableBytes);
NSLog(@"out: %@", out);
于 2013-11-10T12:33:18.860 に答える