Objective C:从钥匙串中导出私钥和公钥

7

我可以使用 SecKeyGeneratePair[Apple CryptoExercise]函数创建公私钥对。

Q1. 密钥链中的密钥显示为,但没有显示任何名称。如何添加友好名称到这些密钥中。enter image description here

Q2. 如何将已生成的公钥和私钥以可用格式导出:

-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqCWtYiGnhAv... 
-----END RSA PUBLIC KEY-----

并且:

-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----

请注意,可以从钥匙串手动导出,但如何使用Objective C API实现此目的?
任何帮助都将不胜感激。
这里有一个类似的问题,但没有答案:iPhone:如何将SecKeyRef或包含公钥位的NSData导出为PEM格式? 没有必要仅出于此目的而使用OpenSSL。
2个回答

3
也许你可以参考苹果公司的这些文档:获取用于公钥密码学的SecKeyRef Object证书、密钥和信任服务程序员指南

获取用于公钥密码学的SecKeyRef Object

从钥匙串中提取密钥:如果您正在使用来自钥匙串的现有公钥和私钥,请阅读证书、密钥和信任服务编程指南,以了解如何为该密钥检索SecKeychainItemRef对象。

一旦您获得了SecKeychainItemRef,您就可以将其转换为SecKeyRef以便与此API一起使用。

导入现有的公钥和私钥:导入和导出公钥和私钥对要比生成新密钥复杂一些,因为常用的密钥格式很多。

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

将密钥导出到CFDataRef对象:

  1. 创建并填充密钥用途数组。
  2. 创建并填充密钥属性数组。
  3. 在参数对象中设置密钥用途和属性字段。
  4. 根据需要设置外部格式和标志值。
  5. 使用API导出密钥,如下所示。
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); }

这并没有回答问题。 - JAL
1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - toesslab
@pc-shooter,感谢你的建议。现在我知道了问题所在,并按照你所说提供了一些必要的答案部分。 - Eric Tsui
现在看起来好多了! - toesslab

0

问题1. 如何为密钥添加友好名称?

SecKeyGeneratePair()的参数字典中使用kSecAttrLabel密钥传递标签。

问题2. 如何将密钥导出为PEM格式?

PEM格式与DER编码文件相同,但是它使用base64编码,并带有附加的头和尾。可以使用kSecFormatX509Cert参数和kSecItemPemArmour标志调用SecItemExport()来接收DER格式的数据。

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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接