AES string encryption in Objective-C

前端 未结 3 1069
故里飘歌
故里飘歌 2020-11-30 10:45

My Objective-C App requires text / string encryption (specifically nsstring).

I know AES is the most secure encryption method available for consumer use. I also und

相关标签:
3条回答
  • 2020-11-30 10:58

    This line near the top says you're adding AES functionality to NSMutableData:

    @implementation NSMutableData(AES)
    

    In Objective-C, this is called a category; categories let you extend an existing class.

    This code would typically go in a file named NSMutableData-AES.m. Create a header file too, NSMutableData-AES.h. It should contain:

    @interface NSMutableData(AES)
    - (NSMutableData*) EncryptAES: (NSString *) key;
    @end
    

    Include (#import) that header in your main file. Add a call to the encryption function in your code:

    NSData *InputData = [Input dataUsingEncoding:NSUTF8StringEncoding];
    NSData *encryptedData = [InputData EncryptAES:@"myencryptionkey"];
    

    Similarly for decryption.

    0 讨论(0)
  • 2020-11-30 11:03

    Since this appears to have been ignored so far:

    CCCryptorStatus result = CCCrypt( kCCDecrypt , kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                     keyPtr, kCCKeySizeAES256,
                                     **NULL**,
                                     [self mutableBytes], [self length],
                                     buffer_decrypt, bufferSize,
                                     &numBytesEncrypted );
    

    From the header file CommonCrypto/CommonCryptor.h:

    @param iv Initialization vector, optional. Used by block ciphers when Cipher Block Chaining (CBC) mode is enabled. If present, must be the same length as the selected algorithm's block size. If CBC mode is selected (by the absence of the kCCOptionECBMode bit in the options flags) and no IV is present, a NULL (all zeroes) IV will be used. This parameter is ignored if ECB mode is used or if a stream cipher algorithm is selected.

    The NULL in bold corresponds to the IV. Sadly, whoever designed the API made it optional. This makes this CBC mode essentially equivalent to ECB, which is not recommended for a variety of reasons.

    0 讨论(0)
  • 2020-11-30 11:14

    I got success using AES with the codes below:

    Header file

    #import <Foundation/Foundation.h>
    #import <CommonCrypto/CommonCryptor.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface SecurityUtils : NSObject
    
    + (NSString *)encrypt:(NSString *)plainText error:(NSError **)error;
    + (NSString *)decrypt:(NSString *)plainText error:(NSError **)error;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    Implementation file

    NSString *const IV = @"AEE0515D0B08A4E4";
    NSString *const KEY =  @"9336565521E5F082BB5929E8E033BC69";
    
    
    #import "SecurityUtils.h"
    
    
    @implementation SecurityUtils
    
    
    + (NSString *)encrypt:(NSString *)plainText error:(NSError **)error {
        NSMutableData *result =  [SecurityUtils doAES:[plainText dataUsingEncoding:NSUTF8StringEncoding] context: kCCEncrypt error:error];
        return [result base64EncodedStringWithOptions:0];
    }
    
    
    + (NSString *)decrypt:(NSString *)encryptedBase64String error:(NSError **)error {
        NSData *dataToDecrypt = [[NSData alloc] initWithBase64EncodedString:encryptedBase64String options:0];
        NSMutableData *result = [SecurityUtils doAES:dataToDecrypt context: kCCDecrypt error:error];
        return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
    
    }
    
    + (NSMutableData *)doAES:(NSData *)dataIn context:(CCOperation)kCCEncrypt_or_kCCDecrypt error:(NSError **)error {
            CCCryptorStatus ccStatus   = kCCSuccess;
            size_t          cryptBytes = 0;
            NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeBlowfish];
            NSData *key =[KEY dataUsingEncoding:NSUTF8StringEncoding];
            NSData *iv = [IV dataUsingEncoding:NSUTF8StringEncoding];
    
            ccStatus = CCCrypt( kCCEncrypt_or_kCCDecrypt,
                               kCCAlgorithmAES,
                               kCCOptionPKCS7Padding,
                               key.bytes,
                               key.length,
                               (iv)?nil:iv.bytes,
                               dataIn.bytes,
                               dataIn.length,
                               dataOut.mutableBytes,
                               dataOut.length,
                               &cryptBytes);
    
            if (ccStatus == kCCSuccess) {
                dataOut.length = cryptBytes;
            }
            else {
                if (error) {
                    *error = [NSError errorWithDomain:@"kEncryptionError"
                                                 code:ccStatus
                                             userInfo:nil];
                }
                dataOut = nil;
            }
    
            return dataOut;
    }
    
    
    @end
    

    IOS TESTING

    NSError *error;
    NSString *encrypted = [SecurityUtils encrypt:@"My Secret Text" error:&error];
    NSLog(@"encrypted: %@",encrypted);
    NSLog(@"decrypted: %@",[SecurityUtils decrypt:encrypted error:&error]);
    

    Finally, the tests outputs:

    IOS OUTPUT

    2019-05-16 21:38:02.947043-0300 MyApp[63392:1590665] encrypted: EJ41am5W1k6fA7ygFjTSEw==
    2019-05-16 21:38:02.947270-0300 MyApp[63392:1590665] decrypted: My Secret Text
    

    My repo on github with this examples: https://github.com/juliancorrea/aes-crypto-android-and-ios

    0 讨论(0)
提交回复
热议问题