2013-10-01 2 views
6

Я пытаюсь написать функцию для создания SHA512 строки в цели из .net функции,.net против Цель с SHA-512 рассогласования

public static string GetSHA512(string strPlain) 
{ 
    UnicodeEncoding UE = new UnicodeEncoding(); 
    byte[] HashValue = null; 
    byte[] MessageBytes = UE.GetBytes(strPlain); 
    System.Security.Cryptography.SHA512Managed SHhash = new System.Security.Cryptography.SHA512Managed(); 
    string strHex = string.Empty; 

    HashValue = SHhash.ComputeHash(MessageBytes); 
    foreach (byte b in HashValue) 
    { 
     strHex += String.Format("{0:x2}", b); 
    } 
    return strHex; 
} 

Это дает результат в виде

input : pass123 
output: 2a6353744cc2914c602265f50d2e413d0561368775756392517abb340ef75d52ee0c5d3623ddd1826fd768a13dca8961f5957c75df0d793b9d7537aabe050705 

Я старались как следовать

-(NSString *)createSHA512:(NSString *)string 
{ 
    const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:string.length]; 
    uint8_t digest[CC_SHA512_DIGEST_LENGTH]; 
    CC_SHA512(data.bytes, data.length, digest); 
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH]; 

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

, который дает результат ниже

input : pass123 
output: fd37ca5ca8763ae077a5e9740212319591603c42a08a60dcc91d12e7e457b024f6bdfdc10cdc1383e1602ff2092b4bc1bb8cac9306a9965eb352435f5dfe8bb0 

Может кто-нибудь предложить, что я делаю неправильно?

Почему эти два значения отличаются?

Исправьте свои ошибки.

EDIT

Mean Хотя я попытался изменить кодировку NSUTF16StringEncoding и NSUnicodeStringEncoding что приводит к еще отличается и следующим

input : pass123 
output: 514331e3f7ca0a295539347ebccc4e4f095fe5f3c1df10d43b4d550144c7b30ba9507831893ea63ea22e62e993be529b0d14be7800a90aa0de199d6be62a5f1b 

ответ

4

немного проб и ошибок в функции и поиск compitable version of encoding found here помочь мне решить проблему.

В преобразовании функции в const char не было необходимости, поэтому удалено и преобразуется напрямую в данные с использованием метода по умолчанию.

-(NSString *)createSHA512:(NSString *)string { 
    NSData *data = [string dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; 
    uint8_t digest[CC_SHA512_DIGEST_LENGTH]; 
    CC_SHA512(data.bytes, data.length, digest); 
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH]; 

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

В Objective C версии вы преобразования текста в двоичный, с помощью UTF-8. В версии .NET вы используете UTF-16. Это не может быть только разница, но это, безусловно, релевантно.

Я бы переписать метод .NET, как:

public static string GetSHA512(string text) 
{ 
    byte[] messageBytes = Encoding.UTF8.GetBytes(text); 

    byte[] hash; 
    using (SHA512 hashAlgorithm = SHA512.Create()) 
    { 
     hash = hashAlgorithm.ComputeHash(messageBytes); 
    } 

    StringBuilder builder = new StringBuilder(); 
    foreach (byte b in hash) 
    { 
     builder.AppendFormat("{0:x2}", b); 
    }   
    return builder.ToString(); 
} 
+0

Спасибо за быстрый ответ, но мы находимся в той стадии, когда мы не можем изменить .net функции и нужно писать compitable функции в Objective C. –

+0

@JanakNirmal Так просто: 'const char * cstr = [string cStringUsingEncoding: NSUTF16StringEncoding];' – NSAddict

+0

@JanakNirmal: Было бы полезно сказать это для начала. В этом случае вам нужно изменить код Objective C, чтобы использовать 'NSUTF16StringEncoding'. –

0

Для base64encoded строки:

-(NSString *)createSHA512Net:(NSString *)string { 
    NSData *data = [string dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; 
    uint8_t digest[CC_SHA512_DIGEST_LENGTH]; 
    CC_SHA512(data.bytes, data.length, digest); 
    NSData *out = [NSData dataWithBytes:digest length:CC_SHA512_DIGEST_LENGTH]; 
    NSString *str = [out base64EncodedStringWithOptions:kNilOptions]; 
    return str; 
} 
Смежные вопросы