2

根据我的要求:

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

我知道如何将字符串转换为 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.
}

任何帮助将不胜感激。

4

4 回答 4

11

我已经创建了这个功能,它可以根据您的要求正常工作。你只需要输入一个字符串。

#import <CommonCrypto/CommonDigest.h>

- (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];
于 2013-03-18T19:08:08.767 回答
1
NSData *dataString = [yourString dataUsingEncoding: NSUTF8StringEncoding];

将字符串转换为 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];
}
于 2013-03-18T18:08:01.490 回答
0

根据您的代码片段,您想要执行以下操作:

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 字符字符串。

于 2013-03-18T19:04:13.777 回答
0

这是一个用于创建 NSString 的 SHA1 哈希的 NSString 类别。从 NSString 创建 SHA1 哈希

于 2015-03-20T06:57:52.973 回答