2016-04-14 20 views
1

ここでは基本的なCC_SHA256の例です:CC_SHA256は異なる入力に対して同じ出力を生成

-(void)hash:(NSData *)input 
{ 
    NSLog(@"Input is %@", [self NSDataToHex:input]); 

    NSMutableData *result = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; 

    CC_SHA256(CFBridgingRetain(input), input.length, result.mutableBytes); 

    NSLog(@"RESULT is %@", result); 
} 

このアルゴリズムが正しく動作しているように見えます。少しテスト:

Input is 6162636465 
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570> 
Input is 666768696A6B 
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570> 
:私は3に第二引数(input.length)を変更した場合、私は次の出力を取得し、今

Input is 6162636465 
RESULT is <91681b5f 162cf494 238e5cac 0debbe92 c3ede9bf 4bcc7e79 845b774f b33e99f7> 
Input is 666768696A6B 
RESULT is <cccf7b6f 9acb96ae 84e9852b 1a753825 d6750555 57175c78 f86cf5fb bb3cfca7> 

NSString* str = @"abcde"; 
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding]; 

[self hash:data]; 

NSString* str2 = @"fghijk"; 
NSData* data2 = [str2 dataUsingEncoding:NSUTF8StringEncoding]; 

[self hash:data2]; 

は、次のような出力を提供します

これらのハッシュは同じです。私はCC_SHA256アルゴリズムが自分の入力の最初の3文字をハッシュするだけだと思う​​が、明らかにそれはそのようには動作しない。さらに、シミュレータを再起動すると、生成されたハッシュが最初とは違っています(しかし、まだ同じです)。

この現象はなぜ発生しますか?この問題に対する(明らかな)回避策を提示しないでください。私は本当にアルゴリズムがこのように動作する理由を知りたがっています。

+1

私はあなたがハッシュのために右の引数に渡しているとは思いません。 'CFBridgingRetain(input)'の代わりに 'input.bytes'を渡してみてください。私の推測では、 'NSData'に関連する内部データをハッシュしている' input'の参照を渡すだけなので、最初の数バイトは同じで、ランチの間で異なります。 SHAは決定論的でなければならないので、同じ入力に対して変更されているという事実は、あなたが間違ってそれを使用していることを意味します。 – Jack

+0

あなたは正しいようです。私はまた、ランダムな性質が非常に奇妙だと思った。私はそれを正しいとマークすることができるようにあなたの答えを加えることができますか? – Dauntless

+0

しかし、実際のアプリケーションでは、入力文字列がずっと長く(64文字)、入力サイズが32に設定されています。全く違う文字列でも同じハッシュ値が得られます... – Dauntless

答えて

1

SHA(および任意のハッシングアルゴリズム)は決定論的である必要があります。したがって、起動の間に変化するという事実は、間違っている可能性が高いことを示しています。

NSDataに関連する内部データをハッシュしている入力の参照を渡すだけなので、最初の数バイトは同じですが、ランチの間で違います。

iOS上でSHA-256を正しく実装するには、これらの他の質問(Sha256 in Objective-C for iPhone)のいずれかを確認してください。 (答えは上から)

-(NSString*)sha256HashFor:(NSString*)input 
{ 
    const char* str = [input UTF8String]; 
    unsigned char result[CC_SHA256_DIGEST_LENGTH]; 
    CC_SHA256(str, strlen(str), result); 

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2]; 
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) 
    { 
     [ret appendFormat:@"%02x",result[i]]; 
    } 
    return ret; 
} 
+0

ありがとうございます回答。しかし、大きな文字列の場合、オブジェクトの最初の32バイトでさえも、同じ長さの2つの異なる文字列が同じハッシュを与える – Dauntless

関連する問題