目标C:从Keychain导出私钥和公钥

时间:2015-06-07 02:03:28

标签: objective-c keychain public-key-encryption private-key

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

Q1。钥匙串中的键显示为不显示任何名称。我们如何为键添加友好名称。 enter image description here

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

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

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

请注意,可以从钥匙串手动导出它们,但如何使用目标C Apis来实现。

任何帮助都会很明显。

这里有类似的问题,但没有任何答案:iPhone: How do you export a SecKeyRef or an NSData containing public key bits to the PEM format? 没有必要为此目的使用OpenSSL。

2 个答案:

答案 0 :(得分:3)

也许您可以参考Apple的这些文件:

Obtaining a SecKeyRef Object for Public Key CryptographyCertificate, Key, and Trust Services Programmer’s Guide

  

获取公钥加密的SecKeyRef对象

     

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

     

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

     

导入现有公钥和私钥导入和导出   公钥和私钥对比起来要复杂一些   由于中的不同密钥格式的数量而生成新密钥   常用。

     

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

将密钥导出到CFDataRef对象

  1. 创建并填充密钥用法数组。
  2. 创建并填充关键属性数组。
  3. 在参数对象中设置密钥用法和属性字段。
  4. 适当设置外部格式和标记值。
  5. 使用API​​导出密钥如下。
  6. 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); }
    

答案 1 :(得分:0)

Q1。我们如何在键上添加友好名称?

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

Q2。如何将密钥导出为PEM格式?

PEM格式与DER编码文件的数据相同,但它在base64中编码,带有额外的页眉和页脚行。调用SecItemExport()时,可以使用kSecFormatX509Cert参数和kSecItemPemArmour标记接收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];