Открытый ключ RSA, созданный в C #, не сохраняется в связке ключей iPhone - PullRequest
1 голос
/ 26 марта 2010

Я пытаюсь отправить открытый ключ RSA с сервера C # на iPhone, чтобы я мог зашифровать информацию на iPhone и расшифровать ее на сервере C #. Но когда я сохраняю полученный открытый ключ в iPhone, он не сохраняется. Я создаю ключ в C # так:

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

На Iphone я использую код от Apple 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;
}

1 Ответ

0 голосов
/ 26 марта 2010

со страницы MSDN:

Метод ExportCspBlob возвращает BLOB-объект, содержащий ключевую информацию, которая совместим с неуправляемым Криптографический API Microsoft

Так что я думаю, у вас нет оснований ожидать, что программное обеспечение IPhone это поймет.

Вы можете добиться большего успеха с ToXml ()

...