IOS中的AES加密算法

来源:互联网 发布:mac 获取当前目录路径 编辑:程序博客网 时间:2024/05/17 07:40

AES算法是一种对称的加密算法,只要有密钥就可以解密加密后的数据。ios中的具体实现如下:

+(NSData *)AESEncryptWithKey:(NSString *)key andData: (NSString *)sourceString{    // 'key' should be 32 bytes for AES256, will be null-padded otherwise    char keyPtr[kCCKeySizeAES128+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];    NSData *data = [sourceString dataUsingEncoding: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;    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,                                          keyPtr, kCCKeySizeAES128,                                          NULL /* 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(buffer); //free the buffer;    return nil;}
+(NSData *)AESDecryptWithKey:(NSString *)key andData: (NSString *)sourceString{    // 'key' should be 32 bytes for AES256, will be null-padded otherwise    char keyPtr[kCCKeySizeAES128+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];     NSData *data = [sourceString dataUsingEncoding: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;    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,                                          keyPtr, kCCKeySizeAES128,                                          NULL /* 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(buffer); //free the buffer;    return nil;}



0 0