¿Cómo enviar una request CommonCrypto POST usando AES Crypto en Objective c?

Solo bash enviar requestes seguras desde la aplicación iOS a los web services de la plataforma php en el objective c. Lo intenté desde hace 2 días, pero no encontré la lógica ni nada sobre cómo lograr esto:

Lo que sigue es un código Swift que usa CryptoSwift Framework

func HTTPPostJSON(url: String, jsonData: Dictionary<String, AnyObject>, type: String = "POST", encrypt: Bool = false, callback: (String, String?) -> Void) { if Debug().state { print("** Start HTTP") } crypto_enabled = encrypt let req = NSMutableURLRequest(URL: NSURL(string: url)!) req.HTTPMethod = type req.addValue(self.dataType, forHTTPHeaderField: self.headerType) let json: JSON = JSON(jsonData) // var data: NSData = NSJSONSerialization.dataWithJSONObject(json.object, options: nil, error: nil)! var data: NSData = NSData() do { data = try NSJSONSerialization.dataWithJSONObject(json.object, options: NSJSONWritingOptions.init(rawValue: 0)) } catch { print("JSON to NSData error: \(error)") } if Debug().state { print("JSON Object: \(json)") } if crypto_enabled { if Debug().state { print("Encryption enabled") } let iv = Cipher.randomIV(AES.blockSize) // println("UInt8 IV: \(iv)") let iv_size = iv.count //count(iv) print("IV Size: \(iv_size)") var key = [UInt8] (self.secret.utf8) // println("UInt8 Key: \(key)") let secret_len = self.secret.characters.count print("Key length: \(secret_len)") if self.secret.characters.count != 32 { if Debug().state { print("Hashing Secret") } let data: NSData = self.secret.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! // key = (CryptoSwift.Hash.md5(data).calculate()!).arrayOfBytes() key = (CryptoSwift.Hash.sha256(data).calculate()!).arrayOfBytes() if Debug().state { print("New UInt8 Key: \(key)") let new_key_len = key.count print("New Key Length: \(new_key_len)") } } let aes = AES(key: key, iv: iv, blockMode: .CBC)! var encrypted: [UInt8] = [] do { encrypted = try aes.encrypt(data.arrayOfBytes()) } catch { print("Encrypt data failed: \(error)") } // IV let ivData: NSData = NSData.withBytes(iv) // println("IV in NSData: \(ivData)\n") let ivBase64 = ivData.base64EncodedDataWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) // println("IV in Base64: \(ivBase64)\n") let ivBase64String = NSString(data: ivBase64, encoding: NSUTF8StringEncoding) as! String // println("IV in Base64 String: \(ivBase64String)\n") // cData let cData_Data = NSData.withBytes(encrypted) // 1st cData Base64 encoding let cData_Base64 = cData_Data.base64EncodedDataWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) let cData_Base64String = NSString(data: cData_Base64, encoding: NSUTF8StringEncoding) as! String // 2nd cData Base64 encoding let cData_Base64String_Data = cData_Base64String.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! let cData_L2_Base64 = cData_Base64String_Data.base64EncodedDataWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) let cData_L2_Base64String = NSString(data: cData_L2_Base64, encoding: NSUTF8StringEncoding) as! String let ciphenetworkingDict: Dictionary<String, AnyObject> = [ "iv": ivBase64String, "cData": cData_L2_Base64String // cData_Base64String ] var ciphenetworkingJSON: JSON = JSON(ciphenetworkingDict) // let ciphenetworkingData: NSData = NSJSONSerialization.dataWithJSONObject(ciphenetworkingJSON.object, options: nil, error: nil)! var ciphenetworkingData: NSData = NSData() do { ciphenetworkingData = try NSJSONSerialization.dataWithJSONObject(ciphenetworkingJSON.object, options: NSJSONWritingOptions.init(rawValue: 0)) } catch { print("Ciphenetworking JSON to NSData error: \(error)") } // if Debug().state { // println("Ciphenetworking Data: \(ciphenetworkingData)") // } data = ciphenetworkingData } //let jsonString = json //self.JSONStringify(json) //let data: NSData = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! req.HTTPBody = data self.HTTPSendReq(req, callback: callback) } 

Intento implementar en el objective c usando MIHCrypto

  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://00.00.00.000/member/slogin"]]; NSMutableDictionary *parameters = [NSMutableDictionary new]; [parameters setObject:@"POS" forKey:@"from"]; [parameters setObject:@"52001" forKey:@"username"]; [parameters setObject:@"111111" forKey:@"password"]; // Specify that it will be a POST request request.HTTPMethod = @"POST"; // This is how we set header fields [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; NSError *jsonSerializationError = nil; NSString*secrate = @"keythatuser"; // Convert your data and set your request's HTTPBody property NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&jsonSerializationError]; NSError *error; NSData *encryptedData = [RNEncryptor encryptData:jsonData withSettings:kRNCryptorAES256Settings password:secrate error:&error]; NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [conn start]; 

Francamente, no tengo idea de cómo hacer el parse, puedes guiarme para cifrar la request del server PHP y después de descifrar su respuesta cifrada.

Podemos hacerlo creando una class auxiliar de Swift en el proyecto Objective-C.

Instalar pods en su proyecto con

 platform :ios, '8.0' use_frameworks! target 'CryptoTest' do pod 'CryptoSwift' end 

Agregue un file rápido de ayuda con encabezado de puente

Para eso vaya a Configuración> Empaquetado> Definir module = Verdadero.

introduzca la descripción de la imagen aquí

Ahora import el CryptoSwift en el file Helper

Por ejemplo :

 // // CryptoHelper.swift // CryptoTest import UIKit import CryptoSwift class CryptoHelper: NSObject { func cryptTest(){ /* Hash enum usage */ let input:[UInt8] = [49, 50, 51] let output = input.md5() // alternatively: let output = CryptoSwift.Hash.md5(input).calculate() print(output.toHexString()) } } 

Ahora usa ese file auxiliar en cualquiera de tus files Objective-C (.m)

Por ejemplo:

 #import "ViewController.h" #import "CryptoTest-Swift.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CryptoHelper *testCrypt = [[CryptoHelper alloc]init]; [testCrypt cryptTest]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 

Aquí #import "CryptoTest-Swift.h" significa #import "YourProjectModuleName-Swift.h" .

Espero que te ayude.

Si todo lo que necesita es enviar una request segura a un server web, simplemente use https. El uso de https encripta la transferencia completa e incluso cualquier parámetro de consulta. No puedes hacerlo mejor

Para agregar security MITM pin el certificate.

Si necesita más security, use RNCryptor, que está disponible en varios idiomas para varias plataforms. Está bien seguro, está bien comprobado y está en desarrollo / mantenimiento actual. Proporciona todos los detalles, como una iv aleatoria, authentication de posts, extensión de key y control de versiones para una gran security.