Cifrado de OpenSSL con pem público en el objective c

He comstackdo y construido openssl para mi proyecto iOS,

pero luchando en el objective c con escribir un código equivalente a esta línea de command:

openssl rsautl -encrypt -inkey publicKey.pem -pubin -in textfile.txt -out encrypted.bin 

¿Cómo puedo conseguir esto?

hola, he sido el mismo problema, finalmente encontré lo que estaba buscando. Lo que necesito como CodeInChaos es mi certificate autofirmado. Con él mi código funciona bien. Para hacerlo utilizo este command:

 openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650 

He encontrado muy útil esta publicación:

http://blog.iamzsx.me/show.html?id=155002

Responde a muchas preguntas. No está en inglés, pero Google traducido bien, así que no es un gran problema.

He hecho esta pequeña function para cifrar datos con el código que encontré y el mío. Tengo mi key pública en mi package y devuelvo el post en un NSDaa codificado en base64 para enviarlo al server:

 + (NSString *)encryptWithPublicKeyMessage:(NSString *) message { NSLog(@"encrypting..."); NSData *inputData = [message dataUsingEncoding:NSUTF8StringEncoding]; const void *bytes = [inputData bytes]; int length = [inputData length]; uint8_t *plainText = malloc(length); memcpy(plainText, bytes, length); /* Open and parse the cert*/ NSData *certData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"public_key" ofType:@"der"]]; SecCertificateRef cert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certData); SecPolicyRef policy = SecPolicyCreateBasicX509(); SecTrustRef trust; OSStatus status = SecTrustCreateWithCertificates(cert, policy, &trust); /* You can ignore the SecTrustResultType, but you have to run SecTrustEvaluate * before you can get the public key */ SecTrustResultType trustResult; if (status == noErr) { status = SecTrustEvaluate(trust, &trustResult); } /* Now grab the public key from the cert */ SecKeyRef publicKey = SecTrustCopyPublicKey(trust); /* allocate a buffer to hold the cipher text */ size_t cipherBufferSize; uint8_t *cipherBuffer; cipherBufferSize = SecKeyGetBlockSize(publicKey); cipherBuffer = malloc(cipherBufferSize); /* encrypt!! */ SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plainText, length, cipherBuffer, &cipherBufferSize); NSData *d = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize]; /* Free the Security Framework Five! */ CFRelease(cert); CFRelease(policy); CFRelease(trust); CFRelease(publicKey); free(cipherBuffer); NSLog(@"encrypted"); return [d encodeBase64ForData]; } 

Espero que me ayude, me lleva un time encontrar el código correcto

Así que resolví mi problema, aquí está la function de mi pregunta que encripta un NSString:

Modifiqué el código del código en esta pregunta: enviar la key pública de RSA a iphone y usarla para encriptar

(También al final de mi código utilizo QSUtilities para codificar el post en base64)

 #pragma mark Encryption using OpenSSL + (NSString *)EncryptMessage:(NSString *)message { NSString *path = [[NSBundle mainBundle] pathForResource:@"pubkey" ofType:@"pem"]; FILE *pubkey = fopen([path cStringUsingEncoding:1], "r"); if (pubkey == NULL) { NSLog(@"duh: %@", [path stringByAppendingString:@" not found"]); return NULL; } RSA *rsa = PEM_read_RSA_PUBKEY(pubkey, NULL, NULL, NULL); if (rsa == NULL) { NSLog(@"Error reading RSA public key."); return NULL; } const char *msgInChar = [message UTF8String]; unsigned char *encrypted = (unsigned char *) malloc(512); //I'm not so sure about this size int bufferSize = RSA_public_encrypt(strlen(msgInChar), (unsigned char *)msgInChar, encrypted, rsa, RSA_PKCS1_PADDING); if (bufferSize == -1) { NSLog(@"Encryption failed"); return NULL; } NSData *data = [NSData dataWithBytes:(const void *)encrypted length:512]; //I'm not so sure about this length NSString *result = [QSStrings encodeBase64WithData:data]; free(rsa); fclose(pubkey); free(encrypted); return result;