title: OSX AES Encryption is not working
body: <p>In my application, i need to encrypt the file before sending it over the network and on the other end, it will get decrypt, This is my code, </p>
  
  <pre><code>-(void)doEncryptTest:(NSString *)pFileName{
  
      // read the NSData; 
      NSStringEncoding encoding  =NSUTF8StringEncoding;
  
      NSString *pFileContent = @"xaaaaaaxxaaaaaax";
  
      NSString *pKey = @"01234567012345670123456701234567";
  
  
      NSData *pData = [pFileContent dataUsingEncoding:encoding];
  
      NSData *pEncryptedData = [pData AES256EncryptWithKey:pKey];
  
  
      NSData *decrypted=[pEncryptedData AES256DecryptWithKey:pKey Data:pEncryptedData];
  
      NSString* pDecryptedDataStr = [[NSString alloc] initWithData:decrypted
                                                        encoding:encoding];
  
  }
  </code></pre>
  
  <p>This is working fine , only and only if Data size is 16 byte, in real time case, when i sent the file of size 151186 bytes, size of [pEncryptedData] is 15200 , and in fact size of decrypted data is same as original data, 
  But pDecryptedDataStr is blank, any guess what is going wrong, 
  please refer below, Encryption and decryption function, </p>
  
  <pre><code>int keySize = kCCKeySizeAES256;
  int padding = kCCOptionPKCS7Padding;
  char ivKey[16]={0,0,0,0,
               0,0,0,0,
               0,0,0,0,
               0,0,0,0};
  //////////////*Encryption*///////////////////
  - (NSData *)AES256EncryptWithKey:(NSString *)key{
      // 'key' should be 32 bytes for AES256, will be null-padded otherwise
      char keyPtr[keySize + 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];
  
      NSUInteger dataLength = [self 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 );
      char ivVector[kCCBlockSizeAES128+1];
      // fetch key data
      [key getCString:ivVector maxLength:sizeof( ivVector ) encoding:NSUTF8StringEncoding];
  
      bzero( ivVector, sizeof( ivVector ) ); // fill with zeroes (for padding)
  
  
      const void *iv=NULL;
      size_t numBytesEncrypted = 0;
  
  
      CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, padding,
                                            keyPtr, keySize,
                                            ivKey /* initialization vector (optional) */,
                                            [self bytes], dataLength, /* input */
                                            buffer, bufferSize, /* output */
                                            &amp;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 *)AES256DecryptWithKey:(NSString *)key   Data:(NSData*)EncryptedData{
      bool same =[self isEqualToData:EncryptedData];
  
      // 'key' should be 32 bytes for AES256, will be null-padded otherwise
      char keyPtr[keySize+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];
  
      NSUInteger dataLength = [EncryptedData 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 );
      const void *iv=NULL;
      char ivVector[kCCBlockSizeAES128+1];
      // fetch key data
      [key getCString:ivVector maxLength:sizeof( ivVector ) encoding:NSUTF8StringEncoding];
  
      bzero( ivVector, sizeof( ivVector ) ); // fill with zeroes (for padding)
  
      size_t numBytesDecrypted = 0;
      NSData *output_decrypt = [[NSData alloc] init];
      CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, padding,
                                            keyPtr, keySize,
                                            ivKey /* initialization vector (optional) */,
                                            [EncryptedData bytes], dataLength, /* input */
                                            buffer,bufferSize ,//bufferSize, /* output */
                                            &amp;numBytesDecrypted );
      output_decrypt = [NSMutableData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
      same =[self isEqualToData:output_decrypt];
      if( cryptStatus == kCCSuccess )
      {
          //the returned NSData takes ownership of the buffer and will free it on deallocation
  
          NSData *pData = [[NSData alloc]initWithBytes:buffer length:numBytesDecrypted];
  
          return pData;
  
      }
  
      free( buffer ); //free the buffer
      return nil;
  }
  </code></pre>