2013-10-01 13 views
6

Ich versuche Funktion zu schreiben, für die von .net Funktion sha512 Zeichenfolge in Ziel zu schaffen, die.net vs Objective c SHA-512 Mismatch

ist
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; 
} 

Dies gibt Ergebnis als

input : pass123 
output: 2a6353744cc2914c602265f50d2e413d0561368775756392517abb340ef75d52ee0c5d3623ddd1826fd768a13dca8961f5957c75df0d793b9d7537aabe050705 

Was ich versucht haben, ist als

folgen
-(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; 
} 

dieErgebnis unter

gibt
input : pass123 
output: fd37ca5ca8763ae077a5e9740212319591603c42a08a60dcc91d12e7e457b024f6bdfdc10cdc1383e1602ff2092b4bc1bb8cac9306a9965eb352435f5dfe8bb0 

Kann mir bitte jemand vorschlagen, was mache ich falsch?

Warum unterscheiden sich diese beiden Werte?

Bitte korrigieren Sie meine Fehler.

EDIT

Mittlere Während ich Codierung NSUTF16StringEncoding und NSUnicodeStringEncoding versucht haben, zu ändern, die noch andere Ergebnisse und als

input : pass123 
output: 514331e3f7ca0a295539347ebccc4e4f095fe5f3c1df10d43b4d550144c7b30ba9507831893ea63ea22e62e993be529b0d14be7800a90aa0de199d6be62a5f1b 

Antwort

4

Ein wenig von Versuch und Irrtum in Funktion und mir für compitable version of encoding found here Hilfe Suche Problem zu lösen.

In der Funktion Konvertierung in const Char war nicht erforderlich, so entfernt und direkt konvertiert Zeichenfolge in Daten mit Standardmethode verfügbar.

-(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

In der Objective-C-Version folgt sind Sie den Text konvertieren Binär mit UTF-8. In der .NET-Version verwenden Sie UTF-16. Das ist vielleicht nicht der Unterschied, aber es ist sicherlich ein relevanter.

würde ich Ihre .NET-Methode umschreiben als:

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

Vielen Dank für Ihre schnelle Antwort, aber wir sind in einem Stadium, wo wir nicht .NET-Funktion ändern können und müssen compitable Funktion in Objective-C schreiben. –

+0

@JanakNirmal So einfach tun: 'const char * cstr = [Zeichenfolge cStringUsingEncoding: NSUTF16StringEncoding];' – NSAddict

+0

@ JanakNirmal: Es wäre wert gewesen, zu sagen, dass zu Beginn mit. In diesem Fall müssen Sie Ihren Objective-C-Code ändern, um 'NSUTF16StringEncoding' zu verwenden. –

0

Für base64encoded string:

-(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; 
}