2011-12-12 11 views
6

Sto usando Xcode e questo è il mio metodo sha512:Objective-C SHA2 hash non funziona correttamente con i non-ASCII

-(NSString*) sha512:(NSString*)input 
{ 
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:input.length]; 

    uint8_t digest[CC_SHA512_DIGEST_LENGTH]; 

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

    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2]; 

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

    return output; 
} 

Quando provo a passare il "test" di input, restituisce: "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff " che corrisponde ad altri strumenti di hash sha512 (incluso il mio programma Java e" http://hash.online-convert.com/sha512-generator ").

Tuttavia, quando immetto caratteri non ascii come "é", restituisce qualcosa di diverso da tutti gli altri strumenti sha512. Per l'ingresso "é", metodo miei restituisce: "60313f8521d3016916d876f7ad11cf42a30dfd4ff9bc557f1e2f90e0d37c56b76ab5e42c8a16db20c18086b0d769c08542429c262cc21ee4fba02bfc689a4797" quando altri strumenti (ancora una volta compreso il mio programma Java e "http://hash.online-convert.com/sha512-generator") ritorno "9e2ad28633f24451bd4f3c1cb20586a21a44c3aeedbdc01b9cc8fa72917ea7bd689c82b8bf1fef89b911cf8cc46fa2c1ccc10087b2094fd4d3350ecd88526a2c".

Mi sono perso qualcosa? Qualche idea su questo? Grazie!

risposta

4

creare l'oggetto NSData in questo modo:

NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding]; 

Basta controllati due volte e funziona correttamente così.

+2

Il problema è che '- [lunghezza NSString]' è il numero di caratteri nella stringa, non il numero di byte necessari per rappresentare quei caratteri in una codifica specifica. "é" è un carattere, ma codificare le informazioni che include sia un e che un accento acuto può richiedere più di un byte in alcune codifiche. –

+0

grazie! Funziona! – evanwong