2

私の要件によると:

  1. 入力文字列はバイト値に変換する必要があります。
  2. 16 ビット値である string の各文字は、下位 8 ビットに変換する必要があります。
  3. Sha1 は、バイト配列で計算されます。
  4. 結果の SHA-1 は 40 文字の文字列に変換されます。

文字列を SHA1 に変換する方法は知っていますが、残りの部分は少し暗いです。最後の 2 つの手順を実行できました。

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 は 2 バイトC3 A9に変換され、"€" = Unicode 20AC は 3 バイトに変換されます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 に答える