Skip to content

Instantly share code, notes, and snippets.

@perry-mitchell
Created November 7, 2017 10:47
Show Gist options
  • Save perry-mitchell/d611a5240e2747dc41edf0bc1d8e33dc to your computer and use it in GitHub Desktop.
Save perry-mitchell/d611a5240e2747dc41edf0bc1d8e33dc to your computer and use it in GitHub Desktop.
Encrypt a string in Objective-C
+ (NSString *)encryptText:(NSString *)text withKey:(NSString *)key andSalt:(NSString *)salt andHMAC:(NSString *)hmacHexKey {
// Validation
if (key.length != 64) {
return @"Error:Invalid key length";
} else if (hmacHexKey.length != 64) {
return @"Error:Invalid authentication information or possible tampering";
}
// Data prep
NSString *iv = [BCCrypto generateIVHex];
NSData *ivData = [BCHelpers dataFromHexString:iv];
NSData *dataIn = [text dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyData = [BCHelpers dataFromHexString:key];
NSData *saltData = [BCHelpers dataFromHexString:salt];
// Crypto prep
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0;
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];
// Crypto
ccStatus = CCCrypt(
kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyData.bytes, keyData.length,
ivData.bytes,
dataIn.bytes, dataIn.length,
dataOut.mutableBytes, dataOut.length,
&cryptBytes
);
if (ccStatus == kCCSuccess) {
dataOut.length = cryptBytes;
} else {
return [NSString stringWithFormat:@"Error=%i", ccStatus];
}
NSString *encryptedContent = [dataOut base64EncodedStringWithOptions:0];
// HMAC
NSString *saltHex = [BCHelpers hexStringFromData:saltData];
NSString *ivHex = [BCHelpers hexStringFromData:ivData];
NSString *hmacTarget = [NSString stringWithFormat:@"%@%@%@", encryptedContent, ivHex, saltHex];
const char *cKey = [BCHelpers characterArrayFromHexString:hmacHexKey];
const char *cData = [hmacTarget cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *hmacData = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString *hmacHex = [BCHelpers hexStringFromData:hmacData];
// Join
return [NSString stringWithFormat:@"%@|%@|%@|%@", encryptedContent, hmacHex, ivHex, saltHex];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment