2010-08-12 17 views
29

मैं उद्देश्य सी में स्ट्रिंग या संख्याओं का सेट कैसे sha1 कर सकता हूं?उद्देश्य सी: SHA1

+0

यह सवाल है http://stackoverflow.com/questions/756492/objective-c- नमूना-code-for-hmac-sha1 के समान ही है। वहां अभी तक कोई जवाब नहीं है, लेकिन मैं पूर्णता के लिए पोस्ट करता हूं। – Eli

+0

क्या यह एक विशेष मंच के लिए है? – ThomasW

+0

@ थॉमसडब्ल्यू मैक ओएस एक्स केवल – Daniel

उत्तर

61

CommonCrypto (एक एप्पल ढांचा) की गणना SHA-1 हैश, सहित एक एक कदम हैश के लिए कार्य करता है:

#include <CommonCrypto/CommonDigest.h> 

unsigned char digest[CC_SHA1_DIGEST_LENGTH]; 
NSData *stringBytes = [someString dataUsingEncoding: NSUTF8StringEncoding]; /* or some other encoding */ 
if (CC_SHA1([stringBytes bytes], [stringBytes length], digest)) { 
    /* SHA-1 hash has been calculated and stored in 'digest'. */ 
    ... 
} 

संख्याओं के एक समूह के लिए, हमें मान लें कि आपके ज्ञात की ints की एक सरणी मतलब जाने लंबाई।

unsigned char digest[CC_SHA1_DIGEST_LENGTH]; 
uint32_t *someIntegers = ...; 
size_t numIntegers = ...; 

CC_SHA1_CTX ctx; 
CC_SHA1_Init(&ctx); 
{ 
    for (size_t i = 0; i < numIntegers; i++) 
     CC_SHA1_Update(&ctx, someIntegers + i, sizeof(uint32_t)); 
} 
CC_SHA1_Final(digest, &ctx); 

/* SHA-1 hash has been calculated and stored in 'digest'. */ 
... 

ध्यान दें कि इस खाते में endianness नहीं ले करता है: इस तरह के डेटा के लिए, यह iteratively डाइजेस्ट के निर्माण के लिए नहीं बल्कि एक शॉट फ़ंक्शन का उपयोग की तुलना में आसान है। PowerPC सिस्टम पर इस कोड के साथ गणना की गई SHA-1 एक i386 या ARM सिस्टम पर गणना की गई भिन्नता से भिन्न होगी। समाधान सरल है - स्वैप एक ज्ञात endianness को पूर्णांक बाइट्स गणना करने से पहले:

for (size_t i = 0; i < numIntegers; i++) { 
     uint32_t swapped = CFSwapInt32HostToLittle(someIntegers[i]); /* or HostToBig */ 
     CC_SHA1_Update(&ctx, &swapped, sizeof(swapped)); 
    } 
+0

आम क्रिप्टो एसडीके से अलग नहीं है – Daniel

+1

4.0.2 के रूप में, हाँ यह है। आगे बढिए और इसे आजमाइए! –

+1

बेशक, यह एक आईओएस विशिष्ट बात है। यह उद्देश्य-सी भाषा के साथ नहीं आता है। –

2

SHA1 वास्तव में उद्देश्य-सी के साथ नहीं आता है। आप hashdeep और दोस्तों के लिए सी स्रोत कोड का उपयोग कर सकते हैं, जो सार्वजनिक डोमेन के तहत लाइसेंस प्राप्त है (क्योंकि यह संयुक्त राज्य सरकार के कर्मचारी द्वारा लिखा गया था): http://md5deep.sourceforge.net/

+0

जीएनयूपीजी (http://www.gnupg.org/related_software/libraries.en.html#lib-libgcrypt) के निर्माताओं से एक और विकल्प libgcrypt होगा। – schot

+0

क्या कोई सुरक्षित एन्क्रिप्शन है जो सीधे ओबीजे सी और PHP के लिए समर्थित है? – Daniel

+1

@schot: लेकिन libcrypt का एक और अधिक प्रतिबंधक लाइसेंस है। @ डैनियल: बॉक्स से बाहर नहीं, नहीं। उद्देश्य-सी लाइब्रेरी के रास्ते में ज्यादा नहीं आता है। –

4

संदेश पचाने पुस्तकालय के साथ एक अन्य समाधान (NV-ios-पचाने):

(1) स्ट्रिंग

// Create an SHA1 instance, update it with a string and do final. 
SHA1 sha1 = [SHA1 sha1WithString:@"Hello"]; 

// Get the pointer of the internal buffer that holds the message digest value. 
// The life of the internal buffer ends when the SHA1 instance is discarded. 
// Copy the buffer as necessary. The size of the buffer can be obtained by 
// 'bufferSize' method. 
unsigned char *digestAsBytes = [sha1 buffer]; 

// Get the string expression of the message digest value. 
NSString *digestAsString = [sha1 description]; 

(2) नंबर

// Create an SHA1 instance. 
SHA1 sha1 = [[SHA1 alloc] init]; 

// Update the SHA1 instance with numbers. 
// (Sorry, the current implementation is endianness-dependent.) 
[sha1 updateWithShort:(short)1]; 
[sha1 updateWithInt:(int)2]; 
[sha1 updateWithLong:(long)3]; 
[sha1 updateWithLongLong:(long long)4]; 
[sha1 updateWithFloat:(float)5]; 
[sha1 updateWithDouble:(double)6]; 

// Do final. 'final' method returns the pointer of the internal buffer 
// that holds the message digest value. 'buffer' method returns the same. 
// The life of the internal buffer ends when the SHA1 instance is discarded. 
// Copy the buffer as necessary. The size of the buffer can be obtained by 
// 'bufferSize' method. 
unsigned char *digestAsBytes = [sha1 final]; 

// Get the string expression of the message digest value. 
NSString *digestAsString = [sha1 description]; 

संदेश पाचन लाइब्रेरी MD5, SHA-1, SHA-224, SHA-256, SHA-384 और SHA-512 का समर्थन करता है।

[ब्लॉग] संदेश समर्पित वर्गों के साथ हज़म iOS पर (MD5, SHA1, आदि)
http://darutk-oboegaki.blogspot.jp/2013/04/message-digests-md5-sha1-etc-on-ios.html

[लाइब्रेरी] NV-ios-पचाने
https://github.com/TakahikoKawasaki/nv-ios-digest