¿Cómo generar un par de keys asimétricas RSA en Swift para IOS?

Necesito una forma de generar un par de keys asimétricas RSA en Swift. No necesito savela en el llavero ni nada. Solo necesito generar un par de keys y meter ambas keys en Variables de cadena.

Las keys deben ser compatibles con PHP en el otro extremo. Utilizaré el encryption simétrico para proteger la key privada y almacenarla en el teléfono. Enviaré la key pública a un service web implementado en PHP, y el service web almacenará la key pública en una database.

Esa key pública será utilizada más tarde por el service web para cifrar valores como passwords de una sola vez y otros valores confidenciales destinados a la aplicación IOS. Implementaré un esquema similar para pequeñas piezas de datos que fluyen desde la aplicación IOS al service web.

La única statement de API documentada que pude encontrar para generar un par de keys en Swift se muestra en developer.apple.com:

func SecKeyGeneratePairAsync(_ parameters: CFDictionary!, _ deliveryQueue: dispatch_queue_t!, _ result: SecKeyGeneratePairBlock!) 

Traté de entender cómo usar esto, pero a XCode no le gustan los guiones bajos, y no estoy seguro de qué se supone que debo hacer con esto o cómo utilizarlo.

Incluso si XCode lo aceptara, no estoy seguro de cómo llamaría a la function y qué valores pasaría, etc. Incluí "Importar security" en la parte superior, así que ese no es el problema.

Es ridículo que esto sea tan difícil. Todo lo que quiero hacer es generar un par de keys asimétricas.

Es un pedacito para hacer esto en PHP o .NET o Java o cualquier otro idioma, pero no puedo encontrar ninguna documentation clara para Swift. Tengo que usar Swift para esta aplicación. No quiero usar OpenSSL porque está en desuso.

Estoy usando a Swift porque odio el objective del maldito C. Swift es la razón por la que finalmente estoy saltando al desarrollo de IOS.

No sé cómo integrar una class Objective C con Swift, y realmente preferiría tener una solución Swift pura si la hay. De lo contrario, agradecería algunos consejos sobre cómo integrar una solución de Objective C y hacer que funcione.

El fragment anterior es la única function que Apple proporciona, y, naturalmente, está incompleta, no tiene sentido y no funciona.

Por favor, ayuda si puedes … sería muy apreciado. 🙂 Gracias

– = Cameron

No estoy familiarizado con una solución rápida para este problema, pero lo bueno de Swift es que todo lo que se ha hecho en el objective c todavía se aplica a proyectos basados ​​en rapidez.

Para realizar un encryption RSA, utilicé el enfoque mencionado en el siguiente enlace:

http://jslim.net/blog/2013/01/05/rsa-encryption-in-ios-and-decrypt-it-using-php/

Básicamente, el autor crea un envoltorio alnetworkingedor de las classs marco de security de Apple, por lo que solo puede centrarse en el encryption. Además, puede modificar los methods de initialization de la siguiente manera para get la longitud de la key pública y la ruta de datos / key pública como parameters:

 - (id)initWithData:(NSData *)keyData publicKeyLength:(int) publicKeyLength { self = [super init]; if (self) { if (keyData == nil) { return nil; } certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef) keyData); if (certificate == nil) { NSLog(@"Can not read certificate from data"); return nil; } policy = SecPolicyCreateBasicX509(); OSStatus returnCode = SecTrustCreateWithCertificates(certificate, policy, &trust); if (returnCode != 0) { NSLog(@"SecTrustCreateWithCertificates fail. Error Code: %d", (int)returnCode); return nil; } SecTrustResultType trustResultType; returnCode = SecTrustEvaluate(trust, &trustResultType); if (returnCode != 0) { return nil; } publicKey = SecTrustCopyPublicKey(trust); if (publicKey == nil) { NSLog(@"SecTrustCopyPublicKey fail"); return nil; } maxPlainLen = SecKeyGetBlockSize(publicKey) - 12; self.publicKeyLength = publicKeyLength; } return self; } - (id)initWithPublicKeyPath:(NSString *)publicKeyPath publicKeyLength:(int) publicKeyLength { if (publicKeyPath == nil) { NSLog(@"Can not find %@", publicKeyPath); return nil; } NSData *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath]; return [self initWithData:publicKeyFileContent publicKeyLength:publicKeyLength]; } 

Estas classs pueden usarse a través de swift, para ello, solo agregue los files al proyecto y el file de encabezado a Bridging-Header.h. Después de esto, usa la class en swift:

 let rsa = RSA(publicKeyPath: "public_key.der",publicKeyLength: 256); rsa.encryptToString("stringToEncrypt") 

Heimdall parece ser lo que estás buscando. Es fácil de usar, puede crear pares de keys RSA, cifrar, descifrar, firmar y verificar.

Utiliza el llavero iOS / OS X para almacenar las keys, por lo que las keys se almacenan de forma segura.

Del Léame de GitHub:

 if let heimdall = Heimdall(tagPrefix: "com.example") { let testString = "This is a test string" // Encryption/Decryption if let encryptedString = heimdall.encrypt(testString) { println(encryptedString) // "cQzaQCQLhAWqkDyPoHnPrpsVh..." if let decryptedString = heimdall.decrypt(encryptedString) { println(decryptedString) // "This is a test string" } } // Signatures/Verification if let signature = heimdall.sign(testString) { println(signature) // "fMVOFj6SQ7h+cZTEXZxkpgaDsMrki..." var verified = heimdall.verify(testString, signatureBase64: signature) println(verified) // True // If someone meddles with the message and the signature becomes invalid verified = heimdall.verify(testString + "injected false message", signatureBase64: signature) println(verified) // False } }