2011-03-01 22 views
1

我的轉換代碼是我所有的,但它將字符串轉換爲sha-1爲十六進制格式。我如何將sha-1轉換爲base64?iphone SDK:如何將字符串轉換爲SHA-1並將SHA-1轉換爲Base64? (用於WSSecurity)

-(NSString *)digest:(NSString*)input 

    int i; 

    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:input.length]; 

    uint8_t digest[CC_SHA1_DIGEST_LENGTH]; 

    CC_SHA1(data.bytes, data.length, digest); 

    output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; 
                length:CC_SHA1_DIGEST_LENGTH]; 

    for(i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) 
    { 
     [output appendFormat:@"%02x", digest[i]]; 
    } 
    return output; 
} 

回答

1

iOS中沒有內置散列或Base64。你將不得不推出自己的。在Google中查找C的SHA1實現;至於Base64,我有一個給你:

NSString *ToBase64(NSData *d) 
{ 
    static const char ALPHABET[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 
    static const NSString *PAD1 = @"=", *PAD2 = @"=="; 

    int l = [d length]; 
    unsigned char *p = (unsigned char*)[d bytes]; 
    unichar Chunk[4]; 
    NSMutableString *s = [NSMutableString stringWithCapacity:(l+3)*4/3]; 
    int i; 
    int mod = l % 3; 
    int ll = l - mod; 
    unsigned int triad; 
    NSString *sChunk; 
    for(i=0;i<ll;i+=3) 
    { 
     triad = (p[i]<<16) | (p[i+1]<<8) | p[i+2]; 
     Chunk[0] = ALPHABET[(triad >> 18) & 0x3f]; 
     Chunk[1] = ALPHABET[(triad >> 12) & 0x3f]; 
     Chunk[2] = ALPHABET[(triad >> 6) & 0x3f]; 
     Chunk[3] = ALPHABET[triad & 0x3f]; 
     sChunk = [[NSString alloc] initWithCharacters:Chunk length:4]; 
     [s appendString:sChunk]; 
     [sChunk release]; 
    } 
    if(mod == 1) 
    { 
     Chunk[0] = ALPHABET[(p[i] >> 2) & 0x3f]; 
     Chunk[1] = ALPHABET[(p[i] << 4) & 0x3f]; 
     sChunk = [[NSString alloc] initWithCharacters:Chunk length:2]; 
     [s appendString:sChunk]; 
     [sChunk release]; 
     [s appendString: PAD2]; 
    } 
    if(mod == 2) 
    { 
     triad = (p[i]<<8) | p[i+1]; 
     Chunk[0] = ALPHABET[(triad >> 10) & 0x3f]; 
     Chunk[1] = ALPHABET[(triad >> 4) & 0x3f]; 
     Chunk[2] = ALPHABET[(triad << 2) & 0x3f]; 
     sChunk = [[NSString alloc] initWithCharacters:Chunk length:3]; 
     [s appendString:sChunk]; 
     [sChunk release]; 
     [s appendString: PAD1];  
    } 
    return s; 
} 
+0

是的,你是對的。 C實現可能會幫助我..感謝您的回答 – Relower 2011-03-01 20:53:04

+0

commonCrypto庫現在可供iOS用戶使用。它提供了各種哈希方法和編碼,包括MD5和SHA1標準。 – Ash 2013-12-27 20:33:55

相關問題