2013-10-01 17 views
6

Tôi cố gắng để viết hàm để tạo chuỗi SHA512 trong khách quan từ chức năng .net đó là.net vs Mục tiêu c SHA-512 không phù hợp

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

này cho kết quả như

input : pass123 
output: 2a6353744cc2914c602265f50d2e413d0561368775756392517abb340ef75d52ee0c5d3623ddd1826fd768a13dca8961f5957c75df0d793b9d7537aabe050705 

Những gì tôi đã thử như sau

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

cho kết quả dưới đây

input : pass123 
output: fd37ca5ca8763ae077a5e9740212319591603c42a08a60dcc91d12e7e457b024f6bdfdc10cdc1383e1602ff2092b4bc1bb8cac9306a9965eb352435f5dfe8bb0 

Có ai vui lòng đề xuất tôi đang làm gì sai không?

Tại sao hai giá trị này lại khác nhau?

Vui lòng sửa lỗi của tôi.

EDIT

bình Trong khi tôi đã cố gắng thay đổi mã hóa để NSUTF16StringEncodingNSUnicodeStringEncoding mà kết quả vẫn khác nhau và như sau

input : pass123 
output: 514331e3f7ca0a295539347ebccc4e4f095fe5f3c1df10d43b4d550144c7b30ba9507831893ea63ea22e62e993be529b0d14be7800a90aa0de199d6be62a5f1b 

Trả lời

4

nhỏ chút thử và sai chức năng và tìm kiếm compitable version of encoding found here giúp đỡ tôi để giải quyết vấn đề.

Trong chuyển đổi hàm thành const char là không cần thiết để loại bỏ và chuyển đổi trực tiếp chuỗi thành dữ liệu bằng cách sử dụng phương pháp mặc định có sẵn.

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

Trong phiên bản C Mục tiêu bạn đang chuyển đổi văn bản thành dạng nhị phân sử dụng UTF-8. Trong phiên bản .NET bạn đang sử dụng UTF-16. Đó có thể không phải là số chỉ có sự khác biệt, nhưng đó chắc chắn là một sự liên quan.

tôi muốn viết lại phương pháp NET của bạn như:

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

Cảm ơn bạn đã phản ứng nhanh chóng của bạn nhưng chúng tôi đang ở trong một giai đoạn mà chúng ta không thể thay đổi .net chức năng và cần phải viết chức năng compitable trong mục tiêu c. –

+0

@JanakNirmal Vì vậy, chỉ cần làm: 'const char * cstr = [string cStringUsingEncoding: NSUTF16StringEncoding]; ' – NSAddict

+0

@JanakNirmal: Điều đáng nói là phải bắt đầu. Trong trường hợp đó, bạn cần thay đổi mã Objective C để sử dụng 'NSUTF16StringEncoding'. –

0

Đối với chuỗi 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; 
} 
Các vấn đề liên quan