2015-07-13 53 views
0

我使用这个网站来生成公钥和私钥 http://travistidwell.com/jsencrypt/demo/和我试图弄明白如何从私有密钥的iOS RSA解密

创建SecKeyRef我发现这个project看起来很很有前途,但对我不起作用。

这里是我的代码,尝试创建SecKeyRef

NSString* publicKey = @"MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHKzKc/6vphvntLiP1r/YvxjSLolPeDeOCy48ao5ymwNU2Nqbfeir/qHqbqSAhclAO8TGq8QIpE5ObAKNp2j01pu8Cu9AqwdtZ6EZa/NYahfITKS8iYGs6cHzk2LGw8AqFOEJqHrW/xR8MOS1J765KeZOBCSrWZ5Ag/lpb5jxiDlAgMBAAE="; 
    [[RSA sharedInstance] setPublicKey:publicKey]; 

- (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; 
} 

我越来越serverPublicRef == nil但误差为0(这是确定的。)

回答

0

kSecClassKey没有kSecValueData字段。你应该看看使用SecPKCS12Import()

一些相关的问题:

+0

谢谢你的提示,可以请你解释多一点上我需要用这种方法做什么和怎么样? – ibm123

+0

我不确定你需要多少信息。所以我添加了一些关于SecPKCS12Import其他问题的链接。 – Mats

+0

我看不到这个链接如何帮助我... – ibm123