iOS中的特定string的SHA1

根据我的要求:

  1. inputstring必须转换为字节值。
  2. string的每个字符(16位值)都必须转换为低8位。
  3. 然后在字节数组上计算Sha1。
  4. 生成的SHA-1被转换成40个字符的string。

我知道如何将一个string转换为SHA1,但是剩下的部分对我来说有些沮丧。 我已经能够完成最后两个步骤。

unsigned char digest[CC_SHA1_DIGEST_LENGTH]; NSData *dataString = [yourString dataUsingEncoding: NSUTF8StringEncoding]; if (CC_SHA1([dataString bytes], [dataString length], digest)) { //Sha1 is calculated & stored in digest. } 

任何帮助将不胜感激。

我已经创build了这个function,它可以根据您的要求正常工作。 你只需要input一个string。

 - (NSString *)calculateSHA:(NSString *)yourString { const char *ptr = [yourString UTF8String]; int i =0; int len = strlen(ptr); Byte byteArray[len]; while (i!=len) { unsigned eachChar = *(ptr + i); unsigned low8Bits = eachChar & 0xFF; byteArray[i] = low8Bits; i++; } unsigned char digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(byteArray, len, digest); NSMutableString *hex = [NSMutableString string]; for (int i=0; i<20; i++) [hex appendFormat:@"%02x", digest[i]]; NSString *immutableHex = [NSString stringWithString:hex]; return immutableHex; } 

那么你只需要调用上面的方法。

 [self calculateSHA:yourString]; 
 NSData *dataString = [yourString dataUsingEncoding: NSUTF8StringEncoding]; 

将string转换为UTF-8字节,例如“é”= Unicode 00E9被转换为两个字节C3 A9 ,而“€”= Unicode 20AC被转换为E2 82 AC三个字节。

如果您的要求是将Unicode字符“截断”到较低的8位,则必须“手动”执行此操作,但我不知道可以使用的内置编码:

 NSMutableData *dataString = [NSMutableData dataWithLength:[yourString length]]; uint8_t *dataBytes = [dataString mutableBytes]; for (NSUInteger i = 0; i < [yourString length]; i++) { // assigning the character to a uint_8 truncates to the lower 8 bit: dataBytes[i] = [yourString characterAtIndex:i]; } 

根据你的代码片段,你想要做的事情是这样的:

 unsigned char digest[CC_SHA1_DIGEST_LENGTH]; NSData *dataString = [yourString dataUsingEncoding: NSUTF8StringEncoding]; NSMutableString *outString; if (CC_SHA1([dataString bytes], [dataString length], digest)) { for (int i=0;i<CC_SHA1_DIGEST_LENGTH;i++) { [outString appendFormat:@"%02x", digest[i]]; } } 

outString将是你的40个string。

下面是一个用于创buildNSString的SHA1哈希的NSString类别 。 从NSString创buildSHA1哈希