2009-04-25 17 views
14

मैं आईफोन एप्लीकेशन विकसित कर रहा हूं। मैंने सुरक्षा/सुरक्षा.h ढांचे के SecKeyGeneratePair विधि का उपयोग किया है। मैं सार्वजनिक & निजी कुंजी को SecKeyRef ऑब्जेक्ट्स के रूप में प्राप्त कर रहा हूं। क्या मैं कुंजी का उपयोग कर सकता हूं या कंसोल के लिए अपना मान प्रिंट कर सकता हूं? क्या मुझे एनएसएसटींग या एनएसडीटा ऑब्जेक्ट मिल सकता है? जब मैं NSLog का उपयोग कर कंसोल की कुंजी प्रिंट करता हूं तो मुझे मिल रहा है। क्या हम इन महत्वपूर्ण वस्तुओं को नेटवर्क पर अन्य एप्लिकेशन में पास कर सकते हैं जो जावा में हो सकता है? क्या हम आईफोन एप्लिकेशन में कुछ पाठ एन्क्रिप्ट कर सकते हैं, इसे सर्वर पर भेज सकते हैं, सर्वर की ओर से पाठ को डिक्रिप्ट करने वाली कुंजी का उपयोग कर?आईएसए में आरएसए एन्क्रिप्शन-डिक्रिप्शन

जोड़ने के लिए संपादित आपकी त्वरित प्रतिक्रिया के लिए धन्यवाद एलेक्स रेनॉल्ड्स। आरएसए एन्क्रिप्शन के मामले में सबसे पहले मुझे एक कुंजी जोड़ी उत्पन्न करना है जो SecKeyRef ऑब्जेक्ट्स के रूप में है। फिर हम उस संदर्भ को SecKeyEncrypt & SecKeyDecrypt विधियों को पारित करेंगे। जब मैं & को स्थानीय रूप से डिक्रिप्ट करता हूं तो यह सही काम कर रहा है, लेकिन यदि मैं सर्वर 0 (जावा कार्यान्वयन) पक्ष पर सर्वर & डिक्रिप्ट करने के लिए कुंजी & एन्क्रिप्टेड डेटा भेजने की कोशिश करता हूं, तो मैं एक महत्वपूर्ण मूल्य के रूप में SecKeyRef ऑब्जेक्ट को सर्वर पर पास नहीं कर पा रहा हूं। जावा में हमें एन्क्रिप्शन विधि को पास करने के लिए स्ट्रिंग या बाइट सरणी प्रारूप में स्ट्रिंग प्राप्त करनी होगी। क्या हम ऑब्जेक्ट SecKeyRef (जो एनएससीएफटी टाइप ऑब्जेक्ट है) में संग्रहीत डेटा तक पहुंच प्राप्त कर सकते हैं? जो एक संरचना __SecKey है।

उत्तर

9

स्ट्रिंग मान प्राप्त करने के लिए एनएसडीटा का उपयोग करने पर विचार करें, और शायद नेटवर्क पर गुजरते समय बेस 64 या एन्कोडिंग के किसी अन्य रूप का उपयोग करें (और उसके बाद बेस 64 से जो भी जावा में डीकोडिंग हो)।

यहां कुछ कोड का एक उदाहरण दिया गया है जो आपको प्रारंभ करने में मदद कर सकता है। मैं एक HMAC-SHA1 हस्ताक्षर कर रहा हूँ ('डाइजेस्ट') यहाँ है, लेकिन सामान्य विचार आपके आरएसए मामले के लिए एक ही है:

#import <Foundation/NSString.h> 
#import <CommonCrypto/CommonHMAC.h> 
#import <CommonCrypto/CommonDigest.h> 

@interface NSString (NSStringAdditions) 

+ (NSString *) base64StringFromData:(NSData *)data length:(int)length; 
- (NSString *) base64StringWithHMACSHA1Digest:(NSString *)secretKey; 

@end 

------------------------------------------- 

#import "NSStringAdditions.h" 

static char base64EncodingTable[64] = { 
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' 
}; 

@implementation NSString (NSStringAdditions) 

- (NSString *) base64StringWithHMACSHA1Digest:(NSString *)secretKey { 
    unsigned char digest[CC_SHA1_DIGEST_LENGTH]; 
    char *keyCharPtr = strdup([secretKey UTF8String]); 
    char *dataCharPtr = strdup([self UTF8String]); 

    CCHmacContext hctx; 
    CCHmacInit(&hctx, kCCHmacAlgSHA1, keyCharPtr, strlen(keyCharPtr)); 
    CCHmacUpdate(&hctx, dataCharPtr, strlen(dataCharPtr)); 
    CCHmacFinal(&hctx, digest); 
    NSData *encryptedStringData = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; 

    free(keyCharPtr); 
    free(dataCharPtr); 

    return [NSString base64StringFromData:encryptedStringData length:[encryptedStringData length]]; 
} 

+ (NSString *) base64StringFromData: (NSData *)data length: (int)length { 
    unsigned long ixtext, lentext; 
    long ctremaining; 
    unsigned char input[3], output[4]; 
    short i, charsonline = 0, ctcopy; 
    const unsigned char *raw; 
    NSMutableString *result; 

    lentext = [data length]; 
    if (lentext < 1) 
    return @""; 
    result = [NSMutableString stringWithCapacity: lentext]; 
    raw = [data bytes]; 
    ixtext = 0; 

    while (true) { 
    ctremaining = lentext - ixtext; 
    if (ctremaining <= 0) 
     break;   
    for (i = 0; i < 3; i++) { 
     unsigned long ix = ixtext + i; 
     if (ix < lentext) 
      input[i] = raw[ix]; 
     else 
      input[i] = 0; 
    } 
    output[0] = (input[0] & 0xFC) >> 2; 
    output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4); 
    output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6); 
    output[3] = input[2] & 0x3F; 
    ctcopy = 4; 

    switch (ctremaining) { 
     case 1: 
     ctcopy = 2; 
     break; 
     case 2: 
     ctcopy = 3; 
     break; 
    } 

    for (i = 0; i < ctcopy; i++) 
     [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]]; 

    for (i = ctcopy; i < 4; i++) 
     [result appendString: @"="]; 

    ixtext += 3; 
    charsonline += 4; 

    if ((length > 0) && (charsonline >= length)) 
     charsonline = 0; 

    return result; 
} 

@end 
+0

कृपया मेरी मदद करो, मुझे समझ नहीं आता कैसे SecKeyRef उदाहरण पारित करने के लिए इस जवाब में विधियों। विधि प्राप्त होती है (एनएसएसटींग *) लेकिन मुझे SecKeyRef से स्ट्रिंग निकालने का कोई तरीका ढूंढना होगा –

संबंधित मुद्दे