No busques más por todo internet ya que estás al lugar adecuado, tenemos la respuesta que quieres sin complicarte.
Solución:
Usando el código en https://web.archive.org/web/20150612123348/http://blog.objectgraph.com/index.php/2010/04/20/encrypting-decrypting-base64-encode-decode-in- iphone-objetivo-c / (el enlace que proporcionó en el comentario), puede cifrar su plist mediante:
NSData *plistFileData = [NSData dataWithContentsOfFile:plistPath];
NSData *encryptedData = [plistFileData AESEncryptWithPassphrase:password];
[encryptedData writeToFile:encryptedPath atomically:YES];
plistPath es un NSString que contiene la ruta al archivo plist que desea cifrar
contraseña es el cifrado key te gustaria usar
ruta cifrada es donde desea guardar el archivo cifrado
para descifrar:
NSData *encryptedData = [NSData dataWithContentsOfFile:encryptedPath];
NSData *plistFileData = [plistFileData AESDecryptWithPassphrase:password];
[plistFileData writeToFile:plistPath atomically:YES];
ruta cifrada es un NSString que contiene la ruta al archivo plist cifrado
contraseña es el cifrado key te gustaria usar
plistPath es donde desea guardar el archivo plist descifrado
El enlace proporcionado por howanghk contiene código con un error. Aplique la corrección proporcionada por InoriXu en esa página web para resolver el problema. Tienes que modificar las funciones de cifrado y descifrado.
Entonces, después de una línea:
const char *password = [pass UTF8String];
agregar:
const int passwordLen = [pass length];
Y cambia de línea:
key[i] = password != 0 ? *password++ : 0;
en:
key[i] = i < passwordLen != 0 ? *password++ : 0;
El código en sí mismo aún agrega algo de espacio detrás, pero si lo necesita para cifrar una lista de propiedades, estará bien.
Aquí hay una respuesta muy simple a esto, espero que esto simplifique el problema, si lo hay;
En primer lugar, debe descargar los archivos NSData + AES aquí. Solo necesita los archivos NSData + AES.h & NSData + AES.m junto con los archivos cipher.h & cipher.m. Una vez en custodia, agregue los archivos a su proyecto Xcode y elimine el encabezado #import Cocoa / Cocoa.h> de NSData + AES.hy cipher.h (solo para aquellos que pretenden programar para iOS, si es para MacOS, deje que el encabezado ser). Importe NSData + AES.h en su archivo donde busca y escribe su archivo plist.
Ahora que se han establecido los conceptos básicos iniciales, asumimos el uso de estos archivos importantes. Lo que debe comprender es la forma en que desea descifrar y cifrar sus datos. En la primera ejecución, debe copiar su plist en la carpeta de documentos y luego cifrarlo. Tenga en cuenta que si lo copia e intenta descifrarlo directamente, arrojará una excepción, por lo que para atender eso, usaremos un valor booleano de UserDefaults y omitiremos el descifrado en la primera ejecución. También necesita definir una constante de directiva de preprocesador string para entretener el secreto key para cifrado y descifrado. Esto es lo que tendrá en su clase DataHandler;
#import
#import "NSData+AES.h"
#define MY_SECRET_KEY @"MY_SECRET_KEY"
static NSMutableDictionary *dataDictionary_ = nil;
static NSMutableDictionary *allSettings_ = nil;
@implementation DataHandler
- (id)init
if(self = [super init])
[self copyPlistData];
return self;
// Encrypt File
- (NSData*)encryptFile:(NSMutableDictionary *)plistDict
NSError *err = nil;
NSData *data = [NSPropertyListSerialization dataWithPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 options:0 error:&err];
NSData *file = [data encryptWithString:MY_SECRET_KEY];
return file;
// Decrypt File
- (NSMutableDictionary *)decryptFile:(NSData *)data
NSError *err = nil;
NSData* newData = [data decryptWithString:MY_SECRET_KEY];
NSPropertyListFormat format;
NSMutableDictionary *file = [NSPropertyListSerialization propertyListWithData:newData options:NSPropertyListMutableContainersAndLeaves format:&format error:&err];
return file;
- (void) copyPlistData
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent: @"myData.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL fileExists = [fileManager fileExistsAtPath:path];
//check if the file exists already in users documents folder
//if file does not exist copy it from the APPLICATION bundle Plist file
if (!fileExists)
NSLog(@"copying database to users documents");
NSString *pathToSettingsInBundle = [[NSBundle mainBundle] pathForResource:@"mydata" ofType:@"plist"];
BOOL copySuccess = [fileManager copyItemAtPath:pathToSettingsInBundle toPath:path error:&error];
if(copySuccess)
noCopyError_ = YES;
//if file is already there do nothing
else
noCopyError_ = YES;
NSLog(@"users database already configured");
BOOL firstRun = [[NSUserDefaults standardUserDefaults] boolForKey:@"IS_FIRST_RUN"];
if(noCopyError_ && firstRun)
dataDictionary_ = [self decryptFile:[NSData dataWithContentsOfFile:path]];
else
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"IS_FIRST_RUN"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"mydata.plist"];
dataDictionary_ = (NSMutableDictionary*)[[NSDictionary alloc ] initWithContentsOfFile:plistPath];
NSMutableDictionary *data = (NSMutableDictionary*)[dictionaryDATA_ objectForKey:@"Data"];
allSettings_ = [data objectForKey:@"AllSettings"];
- (NSMutableDictionary*) properties
NSMutableDictionary * props = [[NSMutableDictionary alloc]init];
[props setObject: allSettings_ forKey:@"AllSettings"];
NSMutableDictionary * data = [NSMutableDictionary dictionaryWithObject:props forKey:@"Data"];
return data;
- (void)persistData
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"mydata.plist"];
NSMutableDictionary *dict = [self properties];
NSData *encryptedDict = [self encryptFile:dict];
[encryptedDict writeToFile:plistPath atomically:YES];
Pero la primera vez que se completa el dataDictionary_, tenemos que forzarlo a persistirlo hábilmente en AppDelegate.m en didFinishLaunching:
DataHandler *dataHandler = [[DataHandler alloc] init];
[dataHandler persistData];
Los datos siempre estarán cifrados en todo momento, pero en el método copyPlist completará sus modelos con respecto al dataDictionary_ e interactuará con esos modelos. Cuando termine, conservará sus modelos y volverá a cifrar, por lo que no se producirán errores. Es una solución simple y bastante viable sin ningún problema. Salud.