美文网首页
iOS加密之AES128-NoPadding-CBC

iOS加密之AES128-NoPadding-CBC

作者: 季末微夏 | 来源:发表于2018-08-03 03:11 被阅读177次
    +(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key {
        char keyPtr[kCCKeySizeAES128+1];
        memset(keyPtr, 0, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
        
        char ivPtr[kCCBlockSizeAES128+1];
        memset(ivPtr, 0, sizeof(ivPtr));
        [key getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
        
        NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
        NSUInteger dataLength = [data length];
        
        int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
        NSInteger newSize = 0;
        
        if(diff > 0)
        {
            newSize = dataLength + diff;
        }
        
        char dataPtr[newSize];
        memcpy(dataPtr, [data bytes], [data length]);
        for(int i = 0; i < diff; i++)
        {
            dataPtr[i + dataLength] = 0x00;
        }
        
        size_t bufferSize = newSize + kCCBlockSizeAES128;
        void *buffer = malloc(bufferSize);
        memset(buffer, 0, bufferSize);
        
        size_t numBytesCrypted = 0;
        
        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                              kCCAlgorithmAES128,
                                              0x0000,               //No padding
                                              keyPtr,
                                              kCCKeySizeAES128,
                                              ivPtr,
                                              dataPtr,
                                              sizeof(dataPtr),
                                              buffer,
                                              bufferSize,
                                              &numBytesCrypted);
        
        if (cryptStatus == kCCSuccess) {
            NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
            return [resultData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
        }
        free(buffer);
        return nil;
    }
    
    +(NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)key
    {
        char keyPtr[kCCKeySizeAES128 + 1];
        memset(keyPtr, 0, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
        
        char ivPtr[kCCBlockSizeAES128 + 1];
        memset(ivPtr, 0, sizeof(ivPtr));
        [key getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
        NSData *data = [[NSData alloc] initWithBase64EncodedData:[encryptText dataUsingEncoding:NSUTF8StringEncoding] options:0];
        NSUInteger dataLength = [data length];
        size_t bufferSize = dataLength + kCCBlockSizeAES128;
        void *buffer = malloc(bufferSize);
        
        size_t numBytesCrypted = 0;
        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                              kCCAlgorithmAES128,
                                              0x0000,
                                              keyPtr,
                                              kCCBlockSizeAES128,
                                              ivPtr,
                                              [data bytes],
                                              dataLength,
                                              buffer,
                                              bufferSize,
                                              &numBytesCrypted);
        if (cryptStatus == kCCSuccess) {
            NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
            NSString *hexString = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
            NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"\0"];
            NSString *trimmedString = [hexString stringByTrimmingCharactersInSet:set];
            return trimmedString;
        }
        free(buffer);
        return nil;
    }
    

    相关文章

      网友评论

          本文标题:iOS加密之AES128-NoPadding-CBC

          本文链接:https://www.haomeiwen.com/subject/ovvupftx.html