2013-10-01 27 views
6

我想寫功能從.NET函數的目標是創建SHA512串.NET VS目標C 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 

任何人都可以請建議我做錯了什麼?

爲什麼這兩個值有所不同?

請糾正我的錯誤。

編輯

平均值,而我試圖改變編碼NSUTF16StringEncodingNSUnicodeStringEncoding其結果還是不同的,如下

input : pass123 
output: 514331e3f7ca0a295539347ebccc4e4f095fe5f3c1df10d43b4d550144c7b30ba9507831893ea63ea22e62e993be529b0d14be7800a90aa0de199d6be62a5f1b 

回答

4

點點,尋找我要compitable version of encoding found here幫助解決問題。

在函數轉換爲常量字符是沒有必要的,因此刪除和直接轉換字符串數據使用默認方法可用。

-(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功能,需要編寫目標C compitable功能。 –

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