2011-12-12 16 views
6
私はXcodeのを使用しています

で正しく動作していない、これは私のSHA512方法です:Objective-CのSHA2ハッシュが非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; 
} 

私は入力「テスト」を渡すためにしようと、それが返されます。 「ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff "は、他のsha512ハッシュツール(私のJavaプログラムと" http://hash.online-convert.com/sha512-generator "を含む)と一致します。

しかし、「é」のような非ASCII文字を入力すると、他のすべてのsha512ツールとは異なるものが返されます。入力「E」のために 、私のメソッドが返す: 「60313f8521d3016916d876f7ad11cf42a30dfd4ff9bc557f1e2f90e0d37c56b76ab5e42c8a16db20c18086b0d769c08542429c262cc21ee4fba02bfc689a4797」 他のツールリターン「9e2ad28633f24451bd4f3c1cb20586a21a44c3aeedbdc01b9cc8fa72917ea7bd689c82b8bf1fef89b911cf8cc46fa2c1ccc10087b2094fd4d3350ecd88526a2c」(再び私のJavaプログラムとの「http://hash.online-convert.com/sha512-generator」を含みます)。

私は何かを見逃しましたか?これについてのアイデアは? ありがとう!

NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding]; 

ちょうどダブルチェックし、それがそのように正常に動作する:

答えて

4

は、このようなあなたのNSDataオブジェクトを作成します。

+2

問題は ' - [NSString length]'は文字列内の文字数であり、特定のエンコーディングでそれらの文字を表現するのに必要なバイト数ではありません。 "é"は1文字ですが、eとacuteの両方のアクセント記号を含む情報のエンコーディングは、一部のエンコーディングでは1バイト以上を取ることができます。 –

+0

ありがとう!できます! – evanwong