यह वही करना चाहिए जो आप पूछ रहे हैं - यह सर्वर की सार्वजनिक कुंजी के साथ डेटा को एन्क्रिप्ट करता है। यह एमआईटीएम हमलों के अधीन नहीं है, जब तक कि हमलावर की आपकी निजी कुंजी और उसका पासवर्ड की प्रतिलिपि न हो (गैर-एसएसएल के माध्यम से संचार करना, फिर भी है, लेकिन सर्वर की कानूनी सार्वजनिक कुंजी के साथ आपके द्वारा एन्क्रिप्ट किया गया डेटा डिक्रिप्ट करना लगभग असंभव होगा) ।
मैंने ऐप्पल के दस्तावेज़ों, इस साइट, ऐप्पल डेवलपर फ़ोरम और शायद कहीं और इसे एक साथ जोड़ दिया। तो हर किसी के लिए धन्यवाद मैंने कोड को पकड़ लिया! इस कोड को कई चीजें हो जाती है:
आप पहले से ही अपने RSA कुंजी जोड़े बना लेने के बाद (मैं एक 4096 बिट कुंजी का उपयोग कर रहा हूँ और यह काफी तेजी से लगता है) और, निजी कुंजी का उपयोग कर, बनाया एक DER- एन्कोड सर्टिफिकेट जिसे "cert.cer" कहा जाता है जिसे आपने अपने ऐप के संसाधन संसाधन में रखा है (जाहिर है, आप अपने सर्वर से प्रमाण भी डाउनलोड कर सकते हैं, लेकिन फिर आप एमआईटीएम हमलों के लिए खुले हैं)। डिफ़ॉल्ट रूप से, ओपनएसएसएल एक पीईएम एन्कोडेड प्रमाण उत्पन्न करता है, इसलिए आपको इसे "openssl x509 -in cert.pem -inform PEM -out cert.cer -outform DER" के रूप में परिवर्तित करना होगा। आईओएस पीईएम पर बारफ होगा। मैं प्रमाण का उपयोग करने का कारण यह है कि काम करना वास्तव में आसान है, और आईओएस में समर्थित है। केवल सार्वजनिक कुंजी का उपयोग नहीं करना है (हालांकि यह किया जा सकता है)।
आपने अपनी परियोजना में सुरक्षा.फ्रेमवर्क जोड़ा है और आप #सुरक्षा/सुरक्षा.h > आयात करें।
/* एन्क्रिप्टेड पाठ, या नहीं के बराबर का एक NSData वापस लौटाता एन्क्रिप्शन असफल रहा था।
(उदाहरण के लिए dataWithContentsOfFile से :,) NSData के रूप में 509 प्रमाणपत्र ले जाता है */
+(NSData *)encryptString:(NSString *)plainText withX509Certificate:(NSData *)certificate {
SecCertificateRef cert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certificate);
SecPolicyRef policy = SecPolicyCreateBasicX509();
SecTrustRef trust;
OSStatus status = SecTrustCreateWithCertificates(cert, policy, &trust);
SecTrustResultType trustResult;
if (status == noErr) {
status = SecTrustEvaluate(trust, &trustResult);
}
SecKeyRef publicKey = SecTrustCopyPublicKey(trust);
const char *plain_text = [plainText UTF8String];
size_t blockSize = SecKeyGetBlockSize(publicKey);
NSMutableData *collectedCipherData = [NSMutableData data];
BOOL success = YES;
size_t cipherBufferSize = blockSize;
uint8_t *cipherBuffer = malloc(blockSize);
int i;
for (i = 0; i < strlen(plain_text); i += blockSize-11) {
int j;
for (j = 0; j < blockSize-11 && plain_text[i+j] != '\0'; ++j) {
cipherBuffer[j] = plain_text[i+j];
}
int result;
if ((result = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, cipherBuffer, j, cipherBuffer, &cipherBufferSize)) == errSecSuccess) {
[collectedCipherData appendBytes:cipherBuffer length:cipherBufferSize];
} else {
success = NO;
break;
}
}
/* Free the Security Framework Five! */
CFRelease(cert);
CFRelease(policy);
CFRelease(trust);
CFRelease(publicKey);
free(cipherBuffer);
if (!success) {
return nil;
}
return [NSData dataWithData:collectedCipherData];
}
नहीं एक सवाल के रूप में जहाँ तक मैं देख सकते हैं। –
क्षमा करें ग्रेग। मैंने अभी एक सवाल जोड़ा है। –
यह एसएसएल के बिना सुरक्षित नहीं होगा; यह एक [मध्य हमले में आदमी] के अधीन होगा (http://en.wikipedia.org/wiki/Man_in_the_middle_attack)। – cobbal