|
#import “AESExtension.h”
@implementation AESExtension
NSString *m_key = @”aaaaaaaaaabbbbbb”;
NSString *m_ivText = @”aaaaaaaaaabbbbbb”;
int m_ivLength = 16;
– (NSData *) aesEncryptNSData🙁NSString *)textString {
NSData *data = [textString dataUsingEncoding:NSUTF8StringEncoding];
NSData *ret = [self AES128Encrypt:data];
return ret;
}
– (NSString *) aesEncryptHexString🙁NSString *)textString {
NSData *ret = [self aesEncryptNSData:textString];
// NSData to HexString
NSString *hexString = [self encodeNSDataToHexString:ret];
return hexString;
}
– (NSString*) aesEncryptBase64🙁NSString *)textString {
NSData *ret = [self aesEncryptNSData:textString];
// NSData to Base64String
NSData *base64Data = [ret base64EncodedDataWithOptions:0];
NSString *base64String = [[NSString alloc] initWithData:base64Data encoding:NSUTF8StringEncoding];
return base64String;
}
– (NSString *) aesDecryptNSData🙁NSData *)nsdata {
NSData *ret = [self AES128Decrypt:nsdata];
NSString *plainText = [[NSString alloc] initWithData:ret encoding:NSUTF8StringEncoding];
return plainText;
}
– (NSString *) aesDecryptHexString🙁NSString *)hexString {
NSData *hexData = [self decodeHexStringToNSData:hexString];
NSString *plainText = [self aesDecryptNSData:hexData];
return plainText;
}
– (NSString *) aesDecryptBase64🙁NSString *)base64String {
// Base64String to NSData
NSData *cryptData = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
NSString *plainText = [self aesDecryptNSData:cryptData];
return plainText;
}
– (NSData *) AES128Encrypt🙁NSData *)Data {
// ‘key’ should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES128+1]; // room for terminator (unused) // oorspronkelijk 256
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[m_key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [Data length];
// See the doc: For block ciphers, the output size will always be less than or
// equal to the input size plus the size of one block.
// That’s why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
// ECB 방식
/*
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionECBMode + kCCOptionPKCS7Padding,
keyPtr,
kCCKeySizeAES128, // oorspronkelijk 256
NULL, // iv : initialization vector (optional)
[Data bytes],
dataLength, // input
buffer,
bufferSize, // output
&numBytesEncrypted);
*/
// CBC 방식
unsigned char iv[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
for (int i=0; i<m_ivLength; i++) {
iv[i] = [m_ivText characterAtIndex:i];
}
NSData *ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
uint8_t clv[m_ivLength];
bzero(clv, m_ivLength);
[ivData getBytes:clv length:m_ivLength];
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
kCCKeySizeAES128, // oorspronkelijk 256
clv, // iv : initialization vector (optional)
[Data bytes],
dataLength, // input
buffer,
bufferSize, // output
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
// the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
// free the buffer
free(buffer);
return nil;
}
– (NSData *) AES128Decrypt🙁NSData *)Data {
// ‘key’ should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES128+1]; // room for terminator (unused) // oorspronkelijk 256
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[m_key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [Data length];
// See the doc: For block ciphers, the output size will always be less than or
// equal to the input size plus the size of one block.
// That’s why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
// ECB 방식
/*
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionECBMode + kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES128, // oorspronkelijk 256
NULL, // iv : initialization vector (optional)
[Data bytes], dataLength, // input
buffer, bufferSize, // output
&numBytesDecrypted);
*/
// CBC 방식
unsigned char iv[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
for (int i=0; i<m_ivLength; i++) {
iv[i] = [m_ivText characterAtIndex:i];
}
NSData *ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
uint8_t clv[m_ivLength];
bzero(clv, m_ivLength);
[ivData getBytes:clv length:m_ivLength];
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES128, // oorspronkelijk 256
clv, // iv : initialization vector (optional)
[Data bytes], dataLength, // input
buffer, bufferSize, // output
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
// the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
// free the buffer
free(buffer);
return nil;
}
– (NSString *) encodeNSDataToHexString🙁NSData *)data {
NSMutableString *hexString = [NSMutableString string];
unsigned char *bytes = (unsigned char *)[data bytes];
char temp[3];
NSUInteger i=0;
for (i=0; i<[data length]; i++){
temp[0] = temp[1] = temp[2] =0;
(void)sprintf(temp, “%02x”,bytes[i]);
[hexString appendString:[NSString stringWithUTF8String:temp]];
}
return hexString;
}
– (NSData *) decodeHexStringToNSData🙁NSString *)hexString {
unsigned long tlen = [hexString length]/2;
char tbuf[tlen];
int i,k,h,l;
bzero(tbuf, sizeof(tbuf));
for (i=0, k=0; i<tlen; i++) {
h=[hexString characterAtIndex:k++];
l=[hexString characterAtIndex:k++];
h=(h >= ‘A’) ? h-‘A’+10 : h-‘0’;
l=(l >= ‘A’) ? l-‘A’+10 : l-‘0’;
tbuf[i]= ((h<<4)&0xf0)| (l&0x0f);
}
return [NSData dataWithBytes:tbuf length:tlen];
}
@end
|