iOS RSA解密
我正在使用此网站生成公钥和私钥 我正试图找出如何从私钥创建SecKeyRef 我发现这看起来很有希望,但对我来说不起作用 下面是我尝试创建SecKeyRef的代码iOS RSA解密,ios,objective-c,rsa,Ios,Objective C,Rsa,我正在使用此网站生成公钥和私钥 我正试图找出如何从私钥创建SecKeyRef 我发现这看起来很有希望,但对我来说不起作用 下面是我尝试创建SecKeyRef的代码 NSString* publicKey = @"MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHKzKc/6vphvntLiP1r/YvxjSLolPeDeOCy48ao5ymwNU2Nqbfeir/qHqbqSAhclAO8TGq8QIpE5ObAKNp2j01pu8Cu9AqwdtZ6EZa/NYah
NSString* publicKey = @"MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHKzKc/6vphvntLiP1r/YvxjSLolPeDeOCy48ao5ymwNU2Nqbfeir/qHqbqSAhclAO8TGq8QIpE5ObAKNp2j01pu8Cu9AqwdtZ6EZa/NYahfITKS8iYGs6cHzk2LGw8AqFOEJqHrW/xR8MOS1J765KeZOBCSrWZ5Ag/lpb5jxiDlAgMBAAE=";
[[RSA sharedInstance] setPublicKey:publicKey];
及
我得到的是
serverPublicRef==nil
,但错误为0(这是正常的)。kSecClassKey没有kSecValueData
字段。你应该研究一下如何使用它
一些相关问题:
- (BOOL)setPublicKey: (NSString *)keyAsBase64 {
NSData *extractedKey =
[[NSData alloc] initWithBase64EncodedString:keyAsBase64 options:0];
/* Load as a key ref */
OSStatus error = noErr;
CFTypeRef persistPeer = NULL;
NSData * refTag = [self.serverPublicIdentifier dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary * keyAttr = [[NSMutableDictionary alloc] init];
[keyAttr setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[keyAttr setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[keyAttr setObject:refTag forKey:(__bridge id)kSecAttrApplicationTag];
/* First we delete any current keys */
error = SecItemDelete((__bridge CFDictionaryRef) keyAttr);
[keyAttr setObject:extractedKey forKey:(__bridge id)kSecValueData];
[keyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnPersistentRef];
error = SecItemAdd((__bridge CFDictionaryRef) keyAttr, (CFTypeRef *)&persistPeer);
if (persistPeer == nil || ( error != noErr && error != errSecDuplicateItem)) {
NSLog(@"Problem adding public key to keychain");
return FALSE;
}
CFRelease(persistPeer);
serverPublicRef = nil;
/* Now we extract the real ref */
[keyAttr removeAllObjects];
/*
[keyAttr setObject:(id)persistPeer forKey:(id)kSecValuePersistentRef];
[keyAttr setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef];
*/
[keyAttr setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[keyAttr setObject:refTag forKey:(__bridge id)kSecAttrApplicationTag];
[keyAttr setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[keyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
// Get the persistent key reference.
error = SecItemCopyMatching((__bridge CFDictionaryRef)keyAttr, (CFTypeRef *)&serverPublicRef);
if (serverPublicRef == nil || ( error != noErr && error != errSecDuplicateItem)) {
NSLog(@"Error retrieving public key reference from chain");
return FALSE;
}
return TRUE;
}