2

I try to use CCCrypt method, but it has different result from XCode4 and XCode5

 - (NSData *)AES256DecryptWithKey:(NSString *)key
{
  // '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];

  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 );

  size_t numBytesDecrypted = 0;
  CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                        keyPtr, kCCKeySizeAES256,
                                        NULL /* initialization vector (optional) */,
                                        [self 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;
}

when I call this method with this lines ... different result

NSString *password = @"E7VRcIXn8yb2Ab+t/in9UzRof6vOpOYebgKbpt1GOcfDF8rpc5nZXngx1G8QfbDqsVrwZw26609GVwruUBrOirCI/WUT8U87fbD6lSy/zPwFIYC113LgXIEylYgzIWO4";
  NSString *pwd = [password AES256DecryptWithKey: @"abcd"];
  if (pwd) {
      NSString *checkKey = @"0sSBf7Ncyov+uzvDikOBiA==";
      NSString *uncryptChk = [checkKey AES256DecryptWithKey: pwd];

In XCode4 the result is "abcd", whereas in XCode5 the result is "".

Michael Foukarakis
  • 39,737
  • 6
  • 87
  • 123
Ivan
  • 21
  • 2
  • 2
    Be aware that since iOS 7 is still under NDA you are not allowed to talk about it outside of the official Apple Developers forum. I suggest you post it there as well, since you will have more luck getting a real answer. – rckoenes Aug 06 '13 at 11:37

1 Answers1

2

Ran into this issue myself. it seems they fixed a bug from iOS6 to iOS7 regarding [NSString keyCString:maxLength:encoding] The old method on iOS6 would cut off part of the buffer to fill the keyPtr.

An easy fix would be to increase the keyPTr size to

char keyPtr = kCCKeySizeAES256 * 2 + 1;

However keep in mind that when you upgrade apps form 6 to 7, while it should work. the keyCString truncates the length to match the size of keyPtr. and replaces the first character with 0. So to make sure that it works on both platforms. Add the above code, and set keyPtr[0] = 0;

Tjirp
  • 2,435
  • 1
  • 25
  • 35