Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C:从密钥链导出私钥和公钥_Objective C_Keychain_Public Key Encryption_Private Key - Fatal编程技术网

Objective c 目标C:从密钥链导出私钥和公钥

Objective c 目标C:从密钥链导出私钥和公钥,objective-c,keychain,public-key-encryption,private-key,Objective C,Keychain,Public Key Encryption,Private Key,我能够使用SecKeyGeneratePair函数创建公私密钥对 问题1。钥匙链中的钥匙显示为,但不显示任何名称。我们如何为这些键添加友好的名称 问题2。但是,如何导出以可用格式生成的公钥和私钥: -----BEGIN RSA PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqCWtYiGnhAv... -----END RSA PUBLIC KEY----- 以及: 注意,它们可以从keychain手动导出,但是如何使

我能够使用
SecKeyGeneratePair
函数创建公私密钥对

问题1。钥匙链中的钥匙显示为,但不显示任何名称。我们如何为这些键添加友好的名称

问题2。但是,如何导出以可用格式生成的公钥和私钥:

-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqCWtYiGnhAv... 
-----END RSA PUBLIC KEY-----
以及:

注意,它们可以从keychain手动导出,但是如何使用objective C API实现这一点呢

任何帮助都是值得的

这里有一个类似的问题,但没有任何答案:
没有必要仅为此目的而使用OpenSSL。

也许您可以参考苹果公司的以下文档:

获取用于公钥加密的SecKeyRef对象

如果正在使用现有的公用和公用密钥,则从密钥链提取密钥 密钥链中的私钥、读取证书、密钥和信任 服务编程指南,了解如何检索 该键的SecKeychainItemRef对象

获得SecKeychainItemRef后,可以将其强制转换为 用于此API的SecKeyRef

导入现有公钥和私钥导入和导出 公钥和私钥对比 由于中的不同密钥格式的数量而生成新密钥 常用的

此示例描述如何在PEM中导入和导出密钥对 (隐私增强邮件)格式

将密钥导出到CFDataRef对象的步骤

  • 创建并填充密钥使用情况数组
  • 创建并填充键属性数组
  • 在parameters对象中设置key usage和attributes字段
  • 适当设置外部格式和标志值
  • 使用API导出密钥,如下所示
  • 问题1。我们如何为这些键添加友好的名称? 使用键传递
    SecKeyGeneratePair()
    的参数字典中的标签

    问题2。如何将密钥导出为PEM格式? PEM格式与DER编码文件的数据相同,但它在base64中编码,并带有额外的页眉和页脚行。调用
    SecItemExport()
    时,可以使用参数和标志接收DER格式的数据


    这并不能回答问题。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。@pc shooter,感谢您提供的提示。现在我知道了这个问题,并提供了一些你所说的答案的基本部分。现在看起来好多了!
    -----BEGIN PRIVATE KEY-----
    -----END PRIVATE KEY-----
    
    OSStatus oserr = SecItemExport(publickey,
        externalFormat, // See SecExternalFormat for details
        flags, // See SecItemImportExportFlags for details
        &params,
        (CFDataRef *)&pkdata); if (oserr) {
        fprintf(stderr, "SecItemExport failed (oserr=%d)\n", oserr);
        exit(-1); }
    
    CFTypeRef key = NULL; // your key
    CFDataRef data;
    SecItemExport(key, kSecFormatX509Cert, kSecItemPemArmour, NULL, &data);
    NSString* base64EncodedString = [(__bridge NSData*)data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSString* pemString = [NSString stringWithFormat:@"-----BEGIN FOO BAR KEY-----\n%@\n-----END FOO BAR KEY-----", base64EncodedString];
    NSData* pemData = [pemString dataUsingEncoding:NSUTF8StringEncoding];