2010-03-26 31 views
1

我试图从C#服务器发送RSA公钥到iPhone,所以我可以在iPhone上加密信息并在C#服务器中解密。但是,当我在iPhone中保存收到的公钥时,它不会被保存。 我C#创建关键是这样的:在C#中创建的RSA公钥不保存在iPhone钥匙串

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); 
byte [] body = rsa.exportCspBlob(false); 

在iPhone上我使用苹果SecKeyWrapper类代码:

NSString *peerName = [NSString stringWithFormat:@"%@%@",peerNamePrefix, serverID ]; 
NSData * peerTag = [[NSData alloc] initWithBytes:(const void *)[peerName UTF8String] ength:[peerName length]]; 
NSMutableDictionary * peerPublicKeyAttr = [[NSMutableDictionary alloc] init]; 

[peerPublicKeyAttr setObject:(id)kSecClassKey forKey:(id)kSecClass]; 
[peerPublicKeyAttr setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType]; 
[peerPublicKeyAttr setObject:peerTag forKey:(id)kSecAttrApplicationTag]; 
[peerPublicKeyAttr setObject:publicKey forKey:(id)kSecValueData]; 
[peerPublicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnPersistentRef]; 

sanityCheck = SecItemAdd((CFDictionaryRef) peerPublicKeyAttr, (CFTypeRef *)&persistPeer); 

此操作sanityCheck为0后,这是确定的。但是:

peerKeyRef = [self getKeyRefWithPersistentKeyRef:persistPeer]; 

返回0x0在peerKeyRef和密钥不保存。

- (SecKeyRef)getKeyRefWithPersistentKeyRef:(CFTypeRef)persistentRef 
{ 
OSStatus sanityCheck = noErr; 
SecKeyRef keyRef = NULL; 

LOGGING_FACILITY(persistentRef != NULL, @"persistentRef object cannot be NULL."); 

NSMutableDictionary * queryKey = [[NSMutableDictionary alloc] init]; 

// Set the SecKeyRef query dictionary. 
[queryKey setObject:(id)persistentRef forKey:(id)kSecValuePersistentRef]; 
[queryKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef]; 

// Get the persistent key reference. 
sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryKey, (CFTypeRef *)&keyRef); 
[queryKey release]; 

return keyRef; 
} 
+0

忘了说了,从服务器的字节数组有148个字节。 如果我在iPhone上生成RSA密钥,公钥有139个字节。可能是这个问题? –

+0

您是否找到了在iOS中导入XML公钥格式的方法? – yasirmturk

回答

0

从MSDN页:

的ExportCspBlob方法返回一个包含关键信息 与非托管 Microsoft加密API

所以我认为你有兼容的 BLOB没有理由期待iPhone软件了解它。

您可以用海toxml用于更多的成功()

+0

好的,以后在iPhone中可以用XML做些什么?我没有发现任何与iPhone中的xml导入密钥相关的任何内容 –

+0

对不起,我不知道Iphone。但是看看XML的元素,它们是相当标准的RSA关键组件。 –

+0

好的,无论如何,谢谢你的回应,你给了我无限的思想 –