2010-02-24 6 views
3

J'ai été Google-recherche et recherche pour une réponse sur la façon de faire un cryptage RSA simple en utilisant Cbjective-C sur un iPhone. Le principal problème que j'ai est que l'objet Exponent et Modulus ont été fournis en tant qu'objet NSData et que je dois ensuite les convertir en objet SecKeyRef afin d'effectuer le chiffrement RSA.iPhone/Objective-c RSA cryptage

Est-ce que quelqu'un a une idée de comment faire cela ou a des conseils utiles?

Merci beaucoup!

Répondre

2

J'ai fini par utiliser OpenSSL dans mon projet. et importez les clés et cryptez en utilisant cette bibliothèque au lieu de celles de l'iPhone.

0

J'ai implémenté une solution à cela et je l'ai mise sur GitHub. Vous pouvez désormais utiliser les API approuvées par Apple pour le trousseau au lieu d'OpenSSL. (Ils dissuadent OpenSSL dans leur littérature, malheureusement.)

https://github.com/StCredZero/SCZ-BasicEncodingRules-iOS

SCZ-BasicEncodingRules iOS

Mise en œuvre de règles de codage pour permettre l'importation de clés RSA à iOS KeyChain utilisant l'exposant. Code cible iOS 5 avec ARC. Supposons que vous ayez déjà un module et un exposant de une clé publique RSA en tant que NSData dans les variables nommées pubKeyModData et pubKeyModData. Ensuite, le code suivant crée un NSData contenant cette clé publique RSA , que vous pouvez ensuite insérer dans le trousseau iOS ou OS X.

NSMutableArray *testArray = [[NSMutableArray alloc] init]; 
[testArray addObject:pubKeyModData]; 
[testArray addObject:pubKeyExpData]; 
NSData *testPubKey = [testArray berData]; 

Cela vous permettra de stocker la clé à l'aide du addPeerPublicKey: keyBits: méthode de SecKeyWrapper dans l'exemple d'Apple CryptoExercise. Ou, du point de vue de l'API de bas niveau, vous pouvez utiliser SecItemAdd().

NSString * peerName = @"Test Public Key"; 

NSData * peerTag = 
    [[NSData alloc] 
     initWithBytes:(const void *)[peerName UTF8String] 
     length:[peerName length]]; 

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

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

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