如何在 ios 上创建 PKCS #12 -> 更一般地说,如何跨平台传输 rsa 私钥/公钥对
Posted
技术标签:
【中文标题】如何在 ios 上创建 PKCS #12 -> 更一般地说,如何跨平台传输 rsa 私钥/公钥对【英文标题】:How to create PKCS #12 on ios -> more generally speaking how to transport rsa private/public key pair cross platform 【发布时间】:2016-04-22 14:38:55 【问题描述】:我有以下用例:用户正在同步一些用于交换(同步)的服务器不应信任的数据。
数据采用 AES 加密,如下 32 个随机字节
同样的 32 个字节使用 RSA 公钥和 aes blob 前缀加密
现在在接收端,用户应该输入他的主密码
解锁 RSA 私钥以解码 256 字节前缀以获得 32 字节
aes密码。 在杰克建造的房子里
太好了,鉴于(愚蠢的恕我直言)要求这应该可以交叉 平台(你知道有多少人同时拥有 vedroid 和 ios 手机 还是从 ios 过渡到 android 的人?) 我需要一些方法将私钥和公钥传输到 同步接收设备。私钥显然需要得到很好的保护。
关于如何处理所有这些的想法?
Android 家伙否认知道如何使用二进制公共 密钥(恰好是使用
提取的 270 个字节 - (NSData *)getPublicKey
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
// Set the public key query dictionary.
[queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
[queryPublicKey setObject:self.publicTag forKey:(id)kSecAttrApplicationTag];
[queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];
CFTypeRef inTypeRef = NULL;
// Get the key bits.
OSStatus sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, &inTypeRef);
NSData * publicKeyBits = nil;
if (sanityCheck == errSecSuccess)
publicKeyBits = (__bridge NSData *)inTypeRef;
return publicKeyBits;
以及使用这个以某种方式以奇数 1200 字节出现的私钥
NSString *md5digest(NSString *masterpassword)
const char * pointer = [masterpassword UTF8String];
unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(pointer, (CC_LONG)strlen(pointer), md5Buffer);
NSMutableString *string = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[string appendFormat:@"%02x",md5Buffer[i]];
return string;
- (NSData *)getPrivatekey:(NSString*)md5digest
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
// Set the public key query dictionary.
[queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
[queryPublicKey setObject:self.privateTag forKey:(id)kSecAttrApplicationTag];
[queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];
CFTypeRef inTypeRef = NULL;
// Get the key bits.
OSStatus sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, &inTypeRef);
NSData * publicKeyBits = nil;
if (sanityCheck == errSecSuccess)
publicKeyBits = (__bridge NSData *)inTypeRef;
NSData *key = [md5digest dataUsingEncoding:NSUTF8StringEncoding];
NSData *aes = [IDBAES256 AES256EncryptWithKey:key data:publicKeyBits];
return aes;
return publicKeyBits;
声称他在 android 上的库需要模数和指数来创建 RSA 密钥对 而且他无法从 uchar 数组中创建它们。
想法? 我显然可以阅读 .p12 就好了 https://developer.apple.com/library/ios/documentation/Security/Conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks.html 但我没有看到任何 API 可以将两个密钥打包到 iOS 上的证书中 对冗长的问题感到抱歉。 我试图将代码量保持在最低限度。
【问题讨论】:
【参考方案1】:我最终使用 openssl 来弥补安全框架在 OP 中概述的功能中的差距
【讨论】:
以上是关于如何在 ios 上创建 PKCS #12 -> 更一般地说,如何跨平台传输 rsa 私钥/公钥对的主要内容,如果未能解决你的问题,请参考以下文章
iOS 中的 AES 解密:PKCS5 padding 和 CBC
指定 CSR 文件时,OpenSSL pkcs12 导出失败
使用OpenSSL创建多级CA证书链签发证书并导出为pkcs12/p12/pfx文件