Skip to content

Instantly share code, notes, and snippets.

@FrankWu100
Last active March 6, 2023 14:41
Show Gist options
  • Save FrankWu100/8048697 to your computer and use it in GitHub Desktop.
Save FrankWu100/8048697 to your computer and use it in GitHub Desktop.
AES Encryption/Decryption on Objective-C
//
// FWEncryptorAES.h
// AES Encryptor
//
// Created by FrankWu on 2013/12/20.
// Copyright (c) 2013年 FrankWu. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface FWEncryptorAES : NSObject
+ (NSData *)encrypt:(NSData *)data Key:(id)key IV:(id)iv;
+ (NSData *)decrypt:(NSData *)data Key:(id)key IV:(id)iv;
+ (NSString *)encryptToBase64:(NSData *)data Key:(id)key IV:(id)iv;
+ (NSData *)decryptFromBase64:(NSString *)data Key:(id)key IV:(id)iv;
+ (NSData *)getKey:(NSString *)key;
+ (NSData *)getIV:(NSString *)iv;
+ (NSString*)convertHexStringFromData:(NSData*)data;
@end
//
// FWEncryptorAES.m
// AES Encryptor
//
// Created by FrankWu on 2013/12/20.
// Copyright (c) 2013年 FrankWu. All rights reserved.
//
#import "FWEncryptorAES.h"
#import "NSData+CommonCrypto.h"
#import "NSData+Base64.h"
@implementation FWEncryptorAES
+ (NSData *)encrypt:(NSData *)data Key:(id)key IV:(id)iv
{
NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]);
NSParameterAssert([iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]);
NSData *keyData = [self getKey:key];
NSData *ivData = [self getIV:iv];
CCCryptorStatus status = kCCSuccess;
NSData *encrypted = [data dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:keyData initializationVector:ivData options:kCCOptionPKCS7Padding error:&status];
return encrypted;
}
+ (NSData *)decrypt:(NSData *)data Key:(id)key IV:(id)iv
{
NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]);
NSParameterAssert([iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]);
NSData *keyData = [self getKey:key];
NSData *ivData = [self getIV:iv];
CCCryptorStatus status = kCCSuccess;
NSData *decrypted = [data decryptedDataUsingAlgorithm:kCCAlgorithmAES128 key:keyData initializationVector:ivData options:kCCOptionPKCS7Padding error:&status];
return decrypted;
}
+ (NSString *)encryptToBase64:(NSData *)data Key:(id)key IV:(id)iv
{
NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]);
NSParameterAssert([iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]);
NSData *encrypted = [self encrypt:data Key:key IV:iv];
return [encrypted base64EncodedString];\
}
+ (NSData *)decryptFromBase64:(NSString *)str Key:(id)key IV:(id)iv
{
NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]);
NSParameterAssert([iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]);
NSData *data = [NSData dataFromBase64String:str];
NSData *decrypted = [self decrypt:data Key:key IV:iv];
return decrypted;
}
+ (NSData *)getKey:(id)key
{
NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]);
if ([key isKindOfClass: [NSString class]])
return [[key dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash];
else
return (NSData *)key;
}
+ (NSData *)getIV:(id)iv
{
NSParameterAssert([iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]);
if ([iv isKindOfClass: [NSString class]])
return [[iv dataUsingEncoding:NSUTF8StringEncoding] MD5Sum];
else
return (NSData *)iv;
}
+ (NSString*)convertHexStringFromData:(NSData*)data
{
const unsigned char *result = [data bytes];
NSMutableString *str = [NSMutableString stringWithCapacity:[data length]];
for(int i = 0; i<[data length]; i++)
{
[str appendFormat:@"%02x",result[i]];
}
return str;
}
@end
@xrick
Copy link

xrick commented Nov 6, 2017

Concise, easy to understand. Good!

@Parikshitw279
Copy link

#import "NSData+CommonCrypto.h" file not found ..

@paramtrivedi
Copy link

#import "NSData+CommonCrypto.h" file not found ..

You can use #import <CommonCrypto/CommonCrypto.h>

@Urvish-Xebia
Copy link

#import "NSData+Base64.h" file not found

@FrankWu100
Copy link
Author

@arsentabaku
Copy link

Does this code works encrypts/decrypts only strings or also files?

@arsentabaku
Copy link

arsentabaku commented Jun 11, 2021

Thank you! Great job 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment