से SecKeyRef लाने में असमर्थ मैं उद्देश्य सी & आईओएस प्रोग्रामिंग के लिए नया हूं।उद्देश्य सी: पीईएम निजी कुंजी
मैं सर्वर और क्लाइंट के बीच आदान-प्रदान की जाने वाली डेटा को एन्क्रिप्ट करने और डिक्रिप्ट करने के लिए openssl का उपयोग करके उत्पन्न एक साधारण सार्वजनिक/निजी कुंजी (पीईएम प्रारूप) का उपयोग कर रहा हूं। मुझे यह सफलतापूर्वक जावा सर्वर & क्लाइंट में काम कर रहा है।
समस्या तब शुरू हुई जब मैं जावा में सार्वजनिक कुंजी का उपयोग करके डेटा एन्क्रिप्ट कर रहा था और उद्देश्य सी/आईओएस में निजी कुंजी का उपयोग करके डिक्रिप्ट कर रहा था। मैंने कुछ उदाहरणों को देखा है और कुछ कोड एक साथ रखे हैं लेकिन मुझे एक त्रुटि मिल रही है -25300 जब मैं निजी कुंजी से SecKeyRef बनाने के हिस्से के रूप में SecItemCopyMatching को हर समय कॉल करता हूं।
बीटीडब्ल्यू, यहां कोई प्रमाण पत्र शामिल नहीं है और यह केवल सादे कुंजी है। यह है कि मैं क्या कर रहा हूं:
- पीईएम निजी कुंजी और बेस 64 डीकोड पढ़ें।
- SecItemCopyMatching का उपयोग करके डीकोडेड स्ट्रिंग से SecKeyRef उत्पन्न करें।
- SecKeyDecrypt का उपयोग करके डिक्रिप्ट करें।
मेरे समस्या # 2 कदम जो -25,300 की स्थिति वापस है (errSecItemNotFound -25,300
आइटम पाया नहीं जा सकता है। आईओएस 2.0 में और बाद में उपलब्ध।)
यहाँ पैदा करने के लिए मेरे कोड है SecKeyRef:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSString *challenge = @"2KFqc46DNSWrizzv69lJN25o62xEYQw/QLcMiT2V1XLER9uJbOu+xH2qgTuNWa1HZ9SW3Lq+HovtkhFmjmf08QkVQohHmxCJXVyCgVhPBleScAgQ8AoP3tmV0RqGb2mJrb19ybeYP7uZ2piVtF4cRwU1gO3VTooCUK3cX4wS7Tc=";
NSLog(@"challenge, %@", challenge);
NSData *incomingData = [self base64DataFromString:challenge];
uint8_t *challengeBuffer = (uint8_t*)[incomingData bytes];
NSLog(@"challengeBuffer: %s", challengeBuffer);
[self decryptWithPrivateKey:challengeBuffer];
free(challengeBuffer);
return YES;
}
// Generate a SecKeyRef from the private key in the private.pem file.
- (SecKeyRef)getPrivateKeyRef {
NSString *startPrivateKey = @"-----BEGIN RSA PRIVATE KEY-----";
NSString *endPrivateKey = @"-----END RSA PRIVATE KEY-----";
NSString* path = [[NSBundle mainBundle] pathForResource:@"private"
ofType:@"pem"];
NSString* content = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:NULL];
NSLog(@"Private Key: %@", content);
NSString *privateKey;
NSScanner *scanner = [NSScanner scannerWithString:content];
[scanner scanUpToString:startPrivateKey intoString:nil];
[scanner scanString:startPrivateKey intoString:nil];
[scanner scanUpToString:endPrivateKey intoString:&privateKey];
NSData *privateTag = [self dataWithBase64EncodedString:privateKey];
NSLog(@"Decoded String: %@", privateTag);
OSStatus status = noErr;
SecKeyRef privateKeyReference = NULL;
NSMutableDictionary * queryPrivateKey = [[NSMutableDictionary alloc] init];
// Set the private key query dictionary.
[queryPrivateKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[queryPrivateKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[queryPrivateKey setObject:privateTag forKey:(__bridge id)kSecAttrApplicationTag];
[queryPrivateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
//[queryPrivateKey setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnRef];
// Get the key.
status = SecItemCopyMatching((__bridge CFDictionaryRef)queryPrivateKey, (CFTypeRef *)&privateKeyReference);
NSLog(@"status: %ld", status);
if(status != noErr)
{
privateKeyReference = NULL;
}
return privateKeyReference;
}
// Decrypt data
- (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer {
OSStatus status = noErr;
SecKeyRef privateKeyRef = [self getPrivateKeyRef];
size_t plainBufferSize = SecKeyGetBlockSize(privateKeyRef);
uint8_t *plainBuffer = malloc(plainBufferSize);
size_t cipherBufferSize = strlen((char *)cipherBuffer);
NSLog(@"decryptWithPrivateKey: length of input: %lu", cipherBufferSize);
// Error handling
status = SecKeyDecrypt(privateKeyRef,
PADDING,
cipherBuffer,
cipherBufferSize,
&plainBuffer[0],
&plainBufferSize
);
NSLog(@"decryption result code: %ld (size: %lu)", status, plainBufferSize);
NSLog(@"FINAL decrypted text: %s", plainBuffer);
}
मैं अब कुछ दिनों के लिए मेरे सिर तोड़ने किया गया है और मुझे लगा जैसे मैं यहाँ कुछ मदद मिल की जरूरत है। कोई भी कोई संकेतक? मैं क्रिप्टो डोमेन ज्ञान और समर्थन प्राप्त करने में अधिक समय व्यतीत कर सकता हूं जो आईओएस प्रदान करता है लेकिन मैं कोई भी आईओएस प्रोग्रामिंग नहीं करता हूं और यह एक बार बात है।
मुझे बस कुछ दिशा चाहिए और मैं इसे काम करने के लिए संघर्ष कर सकता हूं।
टीआईए।
क्या आपने कभी यह काम किया है? वही मुद्दा। –
मुझे अभी भी इसका सामना करना पड़ रहा है। क्या आपको यह काम मिल गया? –
आप केवल उन चीज़ों को पुनर्प्राप्त करने के लिए 'SecItemCopyMatching' का उपयोग कर सकते हैं जिन्हें आपने पहले चाबी में जोड़ा था। जैसा कि आपने कुछ भी नहीं जोड़ा है, पुनः प्राप्त करने के लिए कुछ भी नहीं है। – orkoden