में अपेक्षित के रूप में काम नहीं कर रहा है मुझे इसे बैकएंड सर्वर पर भेजने से पहले अनुरोधों पर हस्ताक्षर करने की आवश्यकता है। हालांकि निजी कुंजी मुझे दी गई है। इसलिए मुझे इसे आयात करने की आवश्यकता है और फिर इसे साइन करने के लिए उपयोग करें। मैं आयात और साइन इन करने में सक्षम हूं लेकिन यह डेटा openssl का उपयोग करके हस्ताक्षर करके मुझे जो मिलता है उससे अलग है। मुझे पता है कि यह गलत कर रहा है क्योंकि जब मैं सार्वजनिक कुंजी आयात करता हूं, तो मैं इसे भी सत्यापित नहीं कर सकता। यदि कोई तरीका है तो मैं कीचेन पर आयात करने से बच सकता हूं, यह भी बहुत अच्छा होगा। कुछ दिनों के लिए इस पर कड़ी मेहनत कर रहे हैं और यह हमारे लिए एक उच्च प्राइ काम है। क्या कोई मदद कर सकता है। कीचेन में निजी कुंजी आयात करना आईफोन
- (SecKeyRef) getPrivateKey {
//RSA KEY BELOW IS DUMMY.
key = @"-----BEGIN RSA PRIVATE KEY-----\nORtMei3ImKI2ZKI636I4+uNCwFfZv9pyJzXyfr1ZNo7iaiW7A0NjLxikNxrWpr/M\n6HD8B2j/CSjRPW3bhsgDXAx/AI1aSfJFxazjiTxx2Lk2Ke3jbhE=\n-----END RSA PRIVATE KEY-----\n";
NSString * tag = @"adpPrivateKey";
NSString *s_key = [NSString string];
NSArray *a_key = [key componentsSeparatedByString:@"\n"];
BOOL f_key = FALSE;
for (NSString *a_line in a_key) {
if ([a_line isEqualToString:@"-----BEGIN RSA PRIVATE KEY-----"]) {
f_key = TRUE;
}
else if ([a_line isEqualToString:@"-----END RSA PRIVATE KEY-----"]) {
f_key = FALSE;
}
else if (f_key) {
s_key = [s_key stringByAppendingString:a_line];
}
}
if (s_key.length == 0) return(nil);
// This will be base64 encoded, decode it.
NSData *d_key = [NSData dataFromBase64String:s_key];
if(d_key == nil) return nil;
NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];
// Delete any old lingering key with the same tag
NSMutableDictionary *privateKey = [[NSMutableDictionary alloc] init];
[privateKey setObject:(id) kSecClassKey forKey:(id)kSecClass];
[privateKey setObject:(id) kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[privateKey setObject:d_tag forKey:(id)kSecAttrApplicationTag];
SecItemDelete((CFDictionaryRef)privateKey);
CFTypeRef persistKey = nil;
// Add persistent version of the key to system keychain
[privateKey setObject:d_key forKey:(id)kSecValueData];
[privateKey setObject:(id) kSecAttrKeyClassPrivate forKey:(id)
kSecAttrKeyClass];
[privateKey setObject:[NSNumber numberWithBool:YES] forKey:(id)
kSecReturnPersistentRef];
OSStatus secStatus = SecItemAdd((CFDictionaryRef)privateKey, &persistKey);
if (persistKey != nil) CFRelease(persistKey);
if ((secStatus != noErr) && (secStatus != errSecDuplicateItem)) {
[privateKey release];
return(nil);
}
// Now fetch the SecKeyRef version of the key
SecKeyRef keyRef = nil;
[privateKey removeObjectForKey:(id)kSecValueData];
[privateKey removeObjectForKey:(id)kSecReturnPersistentRef];
[privateKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef
];
[privateKey setObject:(id) kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
secStatus = SecItemCopyMatching((CFDictionaryRef)privateKey,
(CFTypeRef *)&keyRef);
if(secStatus != noErr)
return nil;
[privateKey release];
return keyRef;
}
नीचे कोड पर हस्ताक्षर करने के लिए किया जाता है। कोड के भाग I सार्वजनिक कुंजी आयात और सत्यापित करने और अपने असफल करने के लिए http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/ में कोड उदाहरण का इस्तेमाल किया एप्पल उदाहरण (http://developer.apple.com/library/ios/#samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_m.html#//apple_ref/doc/uid/DTS40008019-Classes_SecKeyWrapper_m-DontLinkElementID_17)
- (NSData *)getSignatureBytes:(NSString *)plainText {
OSStatus sanityCheck = noErr;
NSData * signedHash = nil;
uint8_t * signedHashBytes = NULL;
size_t signedHashBytesSize = 0;
SecKeyRef privateKey = NULL;
privateKey = [self getPrivateKey];
signedHashBytesSize = SecKeyGetBlockSize(privateKey);
//Create a SHA Encoded
NSString * shaEncoded = [self sha256:plainText];
NSLog(@"%@", shaEncoded);
// Malloc a buffer to hold signature.
signedHashBytes = malloc(signedHashBytesSize * sizeof(uint8_t));
memset((void *)signedHashBytes, 0x0, signedHashBytesSize);
NSData *inputData = [self getHashBytes:[plainText dataUsingEncoding:NSUTF8StringEncoding]];
int bytesLengthUINT8 = [inputData length];
sanityCheck = SecKeyRawSign (privateKey, kSecPaddingPKCS1, (const uint8_t *)inputData, CC_SHA256_DIGEST_LENGTH,(uint8_t *)signedHashBytes, &signedHashBytesSize);
if(sanityCheck != noErr)
return nil;
signedHash = [NSData dataWithBytes:(const void *)signedHashBytes length:(NSUInteger)signedHashBytesSize];
NSString *string = [signedHash base64EncodedString];
NSLog(@"%@", string);
if (signedHashBytes) free(signedHashBytes);
return signedHash;
}
से है।
'kSecPaddingPKCS1' का मूल्य क्या है? क्या आप सार्वजनिक और निजी कुंजी के मॉडुलि की कोशिश और तुलना कर सकते हैं? –
हाय @owlstead, क्या आप कृपया बता सकते हैं कि क्या करना है? मैं निजी कुंजी को सहेजने और पुनर्प्राप्त करने के तरीके में भी कोई समस्या देखता हूं। अगर मुझे अन्य पुस्तकालय उपलब्ध हैं तो कृपया मुझे बताएं कि मैं उपयोग कर सकता हूं। –
क्षमा करें, मैं एक आईओएस विशेषज्ञ नहीं हूँ। मैं अब क्रिप्टो के बारे में काफी कुछ करता हूं, इसलिए मैंने सोचा कि मैं आपको कुछ सामान्य सिफारिशें देता हूं। जैसे 'kSecPaddingPKCS1' हैश निर्दिष्ट नहीं करता है, और SHA-1 डिफ़ॉल्ट होने की संभावना है। यदि निजी कुंजी और सार्वजनिक कुंजी का मॉड्यूल मेल नहीं खाता है, तो वे एक ही कुंजी जोड़ी से संबंधित नहीं हैं। दोनों मामलों में हस्ताक्षर सत्यापन विफल हो जाएगा। –