现在,我的公钥出现了问题,我使用SecKeyGeneratePair生成公共和私有密钥。现在我必须把我的公钥发送到服务器。我使用了下面的方法将SecKeyRef转换为NSData,在那里我总是得到相同的公钥。但是,我将其转换为base64格式,并将其发送到服务器。但是它根本不起作用,服务器(Java)开始抛出错误。以下是我的iOS代码:
- (NSData *)getPublicKeyBits {
OSStatus sanityCheck = noErr;
NSData * publicKeyBits = nil;
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
// Set the public key query dictionary.
[queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
[queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
[queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];
// Get the key bits.
sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);
if (sanityCheck != noErr)
{
publicKeyBits = nil;
}
[queryPublicKey release];
return publicKeyBits;
}有人能帮我把SecKeyRef转换成NSString或NSData吗?
提前谢谢!
-Murali Krishnan
发布于 2012-06-15 19:30:24
我认为iOS生成的键缺少了世界上其他地方(在您的例子中是Java)希望看到的一些头信息。因此,为了使Java能够使用iOS安全API生成的密钥,首先需要将此头信息添加到二进制键中。
相反,为了使iOS Sec* API能够使用openssl或ssh-keygen生成的密钥(例如),您必须首先从二进制密钥中删除此头信息。
具体来说,iOS不喜欢ASN1.OID,世界其他地方也不喜欢。
请参阅本文导出用于Java应用程序使用的iOS生成的密钥--它应该会让您运行:
http://blog.wingsofhermes.org/?p=42
https://stackoverflow.com/questions/10850306
复制相似问题