Używam Xcode i to jest mój sha512 metoda:Objective-C SHA2 hash nie działa poprawnie z nie-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;
}
Gdy próbuję przejść "test" Input, zwraca: „ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff " , która pasuje do innych narzędzi mieszających sha512 (w tym mojego programu Java i" http://hash.online-convert.com/sha512-generator ").
Jednakże, kiedy wprowadzam non-ascii char jak "é", zwraca on coś innego niż wszystkie inne moje narzędzia sha512. Dla wejścia "E", moja metoda powraca: "60313f8521d3016916d876f7ad11cf42a30dfd4ff9bc557f1e2f90e0d37c56b76ab5e42c8a16db20c18086b0d769c08542429c262cc21ee4fba02bfc689a4797" gdy inne narzędzia (ponownie w tym mój program Java i "http://hash.online-convert.com/sha512-generator") return "9e2ad28633f24451bd4f3c1cb20586a21a44c3aeedbdc01b9cc8fa72917ea7bd689c82b8bf1fef89b911cf8cc46fa2c1ccc10087b2094fd4d3350ecd88526a2c".
Czy coś mi umknęło? Wszelkie pomysły na ten temat? Dzięki!
Problem polega na tym, że '- [długość NSString]' jest liczbą znaków w łańcuchu, a nie liczbą bajtów potrzebnych do przedstawienia tych znaków w określonym kodowaniu. "é" to jedna znak, ale kodowanie informacji, które zawiera zarówno e, jak i akcent ostry, może wymagać więcej niż jednego bajtu w niektórych kodowaniach. –
dzięki! to działa! – evanwong