我可以使用SecKeyGeneratePair
[Apple CryptoExercise]函数创建公私密钥对。
Q1。钥匙串中的键显示为不显示任何名称。我们如何为键添加友好名称。
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。
答案 0 :(得分:3)
也许您可以参考Apple的这些文件:
Obtaining a SecKeyRef Object for Public Key Cryptography和 Certificate, Key, and Trust Services Programmer’s Guide
获取公钥加密的SecKeyRef对象
从钥匙串中提取密钥如果您正在使用现有的公共密钥和 来自钥匙串的私钥,读取证书,密钥和信任 服务编程指南,了解如何检索 该密钥的SecKeychainItemRef对象。
获得SecKeychainItemRef后,可以将其转换为 SecKeyRef用于此API。
导入现有公钥和私钥导入和导出 公钥和私钥对比起来要复杂一些 由于中的不同密钥格式的数量而生成新密钥 常用。
此示例介绍如何在PEM中导入和导出密钥对 (隐私增强邮件)格式。
将密钥导出到CFDataRef对象
OSStatus oserr = SecItemExport(publickey, externalFormat, // See SecExternalFormat for details flags, // See SecItemImportExportFlags for details ¶ms, (CFDataRef *)&pkdata); if (oserr) { fprintf(stderr, "SecItemExport failed (oserr=%d)\n", oserr); exit(-1); }
答案 1 :(得分:0)
使用kSecAttrLabel键在SecKeyGeneratePair()
的参数字典中传递标签。
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];