#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *inputTextField;
@property (weak, nonatomic) IBOutlet UITextView *outputTextView;
- (IBAction)encryptDecryptButtonTapped:(id)sender;
@end
#import "ViewController.h"
#import <CommonCrypto/CommonCrypto.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (IBAction)encryptDecryptButtonTapped:(id)sender {
NSString *inputString = self.inputTextField.text;
// Convert input string to array of integers
NSArray *inputArray = [inputString componentsSeparatedByString:@","];
NSMutableArray *integerArray = [NSMutableArray array];
for (NSString *numberString in inputArray) {
[integerArray addObject:@(numberString.integerValue)];
}
// Encrypt the array using AES
NSData *encryptedData = [self encryptArray:integerArray];
// Decrypt the encrypted data
NSArray *decryptedArray = [self decryptData:encryptedData];
// Sort the decrypted array
NSArray *sortedArray = [decryptedArray sortedArrayUsingSelector:@selector(compare:)];
// Convert sorted array to hexadecimal string
NSString *hexString = [self hexadecimalStringFromData:[self dataFromIntArray:sortedArray]];
// Calculate SHA-256 hash value of sorted array
NSString *hashValue = [self sha256HashValueForData:[self dataFromIntArray:sortedArray]];
// Display the results in the output text view
self.outputTextView.text = [NSString stringWithFormat:@"Sorted Array: %@\nEncrypted Value: %@\nSHA-256 Hash Value: %@", sortedArray, hexString, hashValue];
}
- (NSData *)encryptArray:(NSArray *)array {
// Convert array to data
NSData *data = [self dataFromIntArray:array];
// Perform AES encryption
// Replace 'key' and 'iv' with your own values
NSString *key = @"YourEncryptionKey";
NSString *iv = @"YourEncryptionIV";
NSData *encryptedData = [self aesEncryptData:data withKey:key iv:iv];
return encryptedData;
}
- (NSArray *)decryptData:(NSData *)data {
// Perform AES decryption
// Replace 'key' and 'iv' with your own values
NSString *key = @"YourEncryptionKey";
NSString *iv = @"YourEncryptionIV";
NSData *decryptedData = [self aesDecryptData:data withKey:key iv:iv];
// Convert decrypted data to array of integers
NSArray *decryptedArray = [self intArrayFromData:decryptedData];
return decryptedArray;
}
- (NSData *)dataFromIntArray:(NSArray *)array {
NSMutableData *data = [NSMutableData data];
for (NSNumber *number in array) {
int intValue = number.intValue;
[data appendBytes:&intValue length:sizeof(intValue)];
}
return data;
}
- (NSArray *)intArrayFromData:(NSData *)data {
NSMutableArray *array = [NSMutableArray array];
const int *bytes = data.bytes;
NSUInteger length = data.length / sizeof(int);
for (NSUInteger i = 0; i < length; i++) {
int intValue = bytes[i];
[array addObject:@(intValue)];
}
return array;
}
- (NSData *)aesEncryptData:(NSData *)data withKey:(NSString *)key iv:(NSString *)iv {
char keyPtr[kCCKeySizeAES128 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128 + 1];
memset(ivPtr, 0, sizeof(ivPtr));
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = data.length;
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES128,
ivPtr,
data.bytes, dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
- (NSData *)aesDecryptData:(NSData *)data withKey:(NSString *)key iv:(NSString *)iv {
char keyPtr[kCCKeySizeAES128 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128 + 1];
memset(ivPtr, 0, sizeof(ivPtr));
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = data.length;
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES128,
ivPtr,
data.bytes, dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
}
- (NSString *)hexadecimalStringFromData:(NSData *)data {
const unsigned char *dataBytes = (const unsigned char *)data.bytes;
NSMutableString *hexString = [NSMutableString stringWithCapacity:data.length * 2];
for (NSUInteger i = 0; i < data.length; i++) {
[hexString appendFormat:@"%02X", dataBytes[i]];
}
return [hexString copy];
}
- (NSString *)sha256HashValueForData:(NSData *)data {
unsigned char hash[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(data.bytes, (CC_LONG)data.length, hash);
NSMutableString *hashValue = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for (NSUInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hashValue appendFormat:@"%02X", hash[i]];
}
return [hashValue copy];
}
@end