NSData-AES Class Encryption/Decryption in Cocoa

18,433

Why not use the built-in encryption algorithms? Here's an NSData+AES i wrote which uses CCCrypt with a 256it key for AES256 encryption.

You can use it like:

NSData *data = [[NSData dataWithContentsOfFile:@"/etc/passwd"] 
                             encryptWithString:@"mykey"];

and decrypt it with:

NSData *file = [data decryptWithString:@"mykey"];

DISCLAIMER: There no guarantee my NSData+AES is bug-free :) It's fairly new. I welcome code reviews.

Share:
18,433
Pripyat
Author by

Pripyat

There's no place like 127.0.0.1 ...

Updated on June 09, 2022

Comments

  • Pripyat
    Pripyat almost 2 years

    I am attempting to encrypt/decrypt a plain text file in my text editor. encrypting seems to work fine, but the decrypting does not work, the text comes up encrypted. I am certain i've decrypted the text using the word i encrypted it with - could someone look through the snippet below and help me out?

    Thanks :)

    Encrypting:

    NSAlert *alert = [NSAlert alertWithMessageText:@"Encryption"
                                         defaultButton:@"Set"
                                       alternateButton:@"Cancel"
                                           otherButton:nil
                             informativeTextWithFormat:@"Please enter a password to encrypt your file with:"];
        [alert setIcon:[NSImage imageNamed:@"License.png"]];
        NSSecureTextField *input = [[NSSecureTextField alloc] initWithFrame:NSMakeRect(0, 0, 300, 24)];
        [alert setAccessoryView:input];
        NSInteger button = [alert runModal];
        if (button == NSAlertDefaultReturn) {
        [[NSUserDefaults standardUserDefaults] setObject:[input stringValue] forKey:@"password"];   
        NSData *data;
        [self setString:[textView textStorage]];
        NSMutableDictionary *dict = [NSDictionary dictionaryWithObject:NSPlainTextDocumentType
                                                                forKey:NSDocumentTypeDocumentAttribute];
        [textView breakUndoCoalescing];
        data = [[self string] dataFromRange:NSMakeRange(0, [[self string] length])
                         documentAttributes:dict error:outError];
        NSData*encrypt = [data AESEncryptWithPassphrase:[input stringValue]];
        [encrypt writeToFile:[absoluteURL path] atomically:YES];
    

    Decrypting:

        NSAlert *alert = [NSAlert alertWithMessageText:@"Decryption"
                                         defaultButton:@"Open"
                                       alternateButton:@"Cancel"
                                           otherButton:nil
                             informativeTextWithFormat:@"This file has been protected with a password.To view its contents,enter the password below:"];
        [alert setIcon:[NSImage imageNamed:@"License.png"]];
        NSSecureTextField *input = [[NSSecureTextField alloc] initWithFrame:NSMakeRect(0, 0, 300, 24)];
        [alert setAccessoryView:input];
        NSInteger button = [alert runModal];
        if (button == NSAlertDefaultReturn) {
        NSLog(@"Entered Password - attempting to decrypt.");    
        NSMutableDictionary *dict = [NSDictionary dictionaryWithObject:NSPlainTextDocumentType
                                                                    forKey:NSDocumentTypeDocumentOption];   
        NSData*decrypted = [[NSData dataWithContentsOfFile:[self fileName]] AESDecryptWithPassphrase:[input stringValue]];
        mString = [[NSAttributedString alloc]
                   initWithData:decrypted options:dict documentAttributes:NULL
                   error:outError];