0

我生成了一个私有 PKCS#12 密钥,然后将其以 PEM 格式发送,并将其发送到 iPhone 应用程序。我想将此私钥保存在 iPhone 钥匙串中。

首先,我删除了“BEGIN RSA PRIVATE KEY”之类的标题。然后我将其余部分转换为NSData. 然后,使用这样的代码:

Swift 中的 CFDictionaryRef 问题

我能够SecKeyRef从这个私钥中得到一个。

现在我想知道如何SecKeyRef使用SecItemAdd

4

2 回答 2

0

尝试使用此方法转换SecKeyRefNSData

- (NSData *)getPublicKeyBitsFromKey:(SecKeyRef)givenKey {

    static const uint8_t publicKeyIdentifier[] = "com.your.company.publickey";
    NSData *publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)];

    OSStatus sanityCheck = noErr;
    NSData * publicKeyBits = nil;

    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
    [queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];

    // Temporarily add key to the Keychain, return as data:
    NSMutableDictionary * attributes = [queryPublicKey mutableCopy];
    [attributes setObject:(__bridge id)givenKey forKey:(__bridge id)kSecValueRef];
    [attributes setObject:@YES forKey:(__bridge id)kSecReturnData];
    CFTypeRef result;
    sanityCheck = SecItemAdd((__bridge CFDictionaryRef) attributes, &result);
    if (sanityCheck == errSecSuccess) {
        publicKeyBits = CFBridgingRelease(result);

        // Remove from Keychain again:
        (void)SecItemDelete((__bridge CFDictionaryRef) queryPublicKey);
    }

    return publicKeyBits;
}

然后将其添加到钥匙串。
我希望这能解决你的问题。

于 2016-06-16T19:55:19.540 回答
0

这对我有用:

  1. 将私钥转换为 PKCS#8 格式。
  2. 带头
  3. 添加到钥匙串

这两个库可以提供帮助: Swift:https ://github.com/btnguyen2k/swift-rsautils Obj-C:https ://github.com/ideawu/Objective-C-RSA

于 2016-09-18T18:14:03.923 回答