9

现在我的公钥有问题,我使用 SecKeyGeneratePair 生成公钥和私钥。现在我必须将我的公钥发送到服务器。我使用下面的方法将 SecKeyRef 转换为 NSData,我总是得到相同的公钥。但是我将其转换为base64格式并将其发送到服务器。但它根本不起作用,服务器(Java)开始抛出错误。这是我的 iOS 代码:

- (NSData *)getPublicKeyBits {
    OSStatus sanityCheck = noErr;
    NSData * publicKeyBits = nil;

    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];

    // Set the public key query dictionary.
    [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];

    // Get the key bits.
    sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);

    if (sanityCheck != noErr)
    {
        publicKeyBits = nil;
    }

    [queryPublicKey release];

    return publicKeyBits;
}

谁能帮我将 SecKeyRef 转换为 NSString 或 NSData。

提前致谢!!!

——穆拉利克里希南

4

1 回答 1

9

我认为 iOS 生成的密钥缺少一些世界其他地方(在您的情况下为 Java API)期望看到的标头信息。因此,为了让 Java 使用由 iOS 安全 API 生成的密钥,您首先需要将此标头信息添加到二进制密钥中。

相反,为了让 iOS Sec* API 使用由 openssl 或 ssh-keygen 生成的密钥(例如),您必须首先从二进制密钥中删除此标头信息。

具体来说,iOS 不喜欢 ASN.1 OID,而世界其他地方则喜欢。

请参阅这篇文章以导出 iOS 生成的密钥以供 Java 应用程序使用——它应该可以帮助您:

http://blog.wingsofhermes.org/?p=42

于 2012-06-15T19:30:24.113 回答