SHOW:
|
|
- or go back to the newest paste.
| 1 | CCCrypt encryption result issue | |
| 2 | - | @implementation NSData (AES256) |
| 2 | + | @implementation NSData (AES256) |
| 3 | - | |
| 3 | + | |
| 4 | - | - (NSData *)AES256EncryptWithKey:(NSString *)key |
| 4 | + | - (NSData *)AES256EncryptWithKey:(NSString *)key |
| 5 | - | { |
| 5 | + | {
|
| 6 | - | char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) |
| 6 | + | char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) |
| 7 | - | bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) |
| 7 | + | bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) |
| 8 | - | |
| 8 | + | |
| 9 | - | // fetch key data |
| 9 | + | // fetch key data |
| 10 | - | [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; |
| 10 | + | [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; |
| 11 | - | |
| 11 | + | |
| 12 | - | NSUInteger dataLength = [self length]; |
| 12 | + | NSUInteger dataLength = [self length]; |
| 13 | - | |
| 13 | + | |
| 14 | - | size_t bufferSize = dataLength + kCCBlockSizeAES128; |
| 14 | + | size_t bufferSize = dataLength + kCCBlockSizeAES128; |
| 15 | - | void *buffer = malloc(bufferSize); |
| 15 | + | void *buffer = malloc(bufferSize); |
| 16 | - | |
| 16 | + | |
| 17 | - | size_t numBytesEncrypted = 0; |
| 17 | + | size_t numBytesEncrypted = 0; |
| 18 | - | CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, |
| 18 | + | CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, |
| 19 | - | keyPtr, kCCKeySizeAES256, |
| 19 | + | keyPtr, kCCKeySizeAES256, |
| 20 | - | NULL /* initialization vector (optional) */, |
| 20 | + | NULL /* initialization vector (optional) */, |
| 21 | - | [self bytes], dataLength, /* input */ |
| 21 | + | [self bytes], dataLength, /* input */ |
| 22 | - | buffer, bufferSize, /* output */ |
| 22 | + | buffer, bufferSize, /* output */ |
| 23 | - | &numBytesEncrypted); |
| 23 | + | &numBytesEncrypted); |
| 24 | - | if (cryptStatus == kCCSuccess) { |
| 24 | + | if (cryptStatus == kCCSuccess) {
|
| 25 | - | return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; |
| 25 | + | return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; |
| 26 | - | } |
| 26 | + | } |
| 27 | - | |
| 27 | + | |
| 28 | - | free(buffer); //free the buffer; |
| 28 | + | free(buffer); //free the buffer; |
| 29 | - | return nil; |
| 29 | + | return nil; |
| 30 | - | } |
| 30 | + | |
| 31 | - | |
| 31 | + | |
| 32 | - | - (NSData *)AES256DecryptWithKey:(NSString *)key { |
| 32 | + | - (NSData *)AES256DecryptWithKey:(NSString *)key {
|
| 33 | - | char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) |
| 33 | + | char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) |
| 34 | - | bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) |
| 34 | + | bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) |
| 35 | - | |
| 35 | + | |
| 36 | - | // fetch key data |
| 36 | + | // fetch key data |
| 37 | - | [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; |
| 37 | + | [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; |
| 38 | - | |
| 38 | + | |
| 39 | - | NSUInteger dataLength = [self length]; |
| 39 | + | NSUInteger dataLength = [self length]; |
| 40 | - | |
| 40 | + | |
| 41 | - | size_t bufferSize = dataLength + kCCBlockSizeAES128; |
| 41 | + | size_t bufferSize = dataLength + kCCBlockSizeAES128; |
| 42 | - | void *buffer = malloc(bufferSize); |
| 42 | + | void *buffer = malloc(bufferSize); |
| 43 | - | |
| 43 | + | |
| 44 | - | size_t numBytesDecrypted = 0; |
| 44 | + | size_t numBytesDecrypted = 0; |
| 45 | - | CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, |
| 45 | + | CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, |
| 46 | - | keyPtr, kCCKeySizeAES256, |
| 46 | + | keyPtr, kCCKeySizeAES256, |
| 47 | - | NULL /* initialization vector (optional) */, |
| 47 | + | NULL /* initialization vector (optional) */, |
| 48 | - | [self bytes], dataLength, /* input */ |
| 48 | + | [self bytes], dataLength, /* input */ |
| 49 | - | buffer, bufferSize, /* output */ |
| 49 | + | buffer, bufferSize, /* output */ |
| 50 | - | &numBytesDecrypted); |
| 50 | + | &numBytesDecrypted); |
| 51 | - | |
| 51 | + | |
| 52 | - | if (cryptStatus == kCCSuccess) { |
| 52 | + | if (cryptStatus == kCCSuccess) {
|
| 53 | - | //the returned NSData takes ownership of the buffer and will free it on deallocation |
| 53 | + | //the returned NSData takes ownership of the buffer and will free it on deallocation |
| 54 | - | return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; |
| 54 | + | return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; |
| 55 | - | } |
| 55 | + | } |
| 56 | - | |
| 56 | + | |
| 57 | - | free(buffer); //free the buffer; |
| 57 | + | free(buffer); //free the buffer; |
| 58 | - | return nil; |
| 58 | + | return nil; |
| 59 | } | |
| 60 | ||
| 61 | - | NSString decryptedString = [[NSString alloc]initWithData:decryptedData]; |
| 61 | + | NSString decryptedString = [[NSString alloc]initWithData:decryptedData]; |
| 62 | - | |
| 62 | + | |
| 63 | - | NSData *data = [NSData dataByBase64DecodingString:decryptedString]; |
| 63 | + | NSData *data = [NSData dataByBase64DecodingString:decryptedString]; |
| 64 | - | |
| 64 | + | |
| 65 | decryptedString = [data dataUsingEncoding:NSUTF8StrinEncoding]; |