Any cocoa source code for AES encryption decryption?

后端 未结 4 1481
情歌与酒
情歌与酒 2020-11-28 08:04

I am searching for some cocoa code on AES encryption and I did some google search for it. I found this very useful link - http://iphonedevelopment.blogspot.com/2009/02/str

4条回答
  •  一向
    一向 (楼主)
    2020-11-28 08:13

    All examples I found didn't work for me, so I changed the solution above. This one works for me and uses the Google-Lib for Base64 stuff:

    + (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData*)data encryptOrDecrypt:(CCOperation)encryptOrDecrypt {
    
        // 'key' should be 32 bytes for AES256, will be null-padded otherwise
        char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
        bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
    
        // fetch key data
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
        if (encryptOrDecrypt == kCCDecrypt)
        {
            data = [GTMBase64 decodeData:data];
        }
    
            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;
        CCCryptorStatus cryptStatus = CCCrypt(encryptOrDecrypt,
                                              kCCAlgorithmAES128,
                                              kCCOptionPKCS7Padding,
                                              keyPtr,
                                              kCCKeySizeAES256,
                                              NULL /* initialization vector (optional) */,
                                              [data bytes], dataLength, /* input */
                                              buffer,       bufferSize, /* output */
                                              &numBytesDecrypted);
    
        if (cryptStatus != kCCSuccess){ 
            NSLog(@"ERROR WITH FILE ENCRYPTION / DECRYPTION");
            return nil;
        }
    
        NSData *result;
    
        if (encryptOrDecrypt == kCCDecrypt)
        {
            result = [NSData dataWithBytes:(const void *)buffer length:(NSUInteger)numBytesDecrypted];
        }
        else
        {
            NSData *myData = [NSData dataWithBytes:(const void *)buffer length:(NSUInteger)numBytesDecrypted];
            result = [GTMBase64 encodeData:myData];
        }
    
        free(buffer); //free the buffer;
        return result;
    }
    

提交回复
热议问题