title: How can I make my AES encryption identical between Java and Objective-C (iPhone)?
body: <p>I am encrypting a string in objective-c and also encrypting the same string in Java using AES and am seeing some strange issues. The first part of the result matches up to a certain point but then it is different, hence when i go to decode the result from Java onto the iPhone it cant decrypt it.</p>
  
  <p>I am using a source string of "Now then and what is this nonsense all about. Do you know?"
  Using a key of "1234567890123456"</p>
  
  <p>The objective-c code to encrypt is the following: NOTE: it is a NSData category so assume that the method is called on an NSData object so 'self' contains the byte data to encrypt.</p>
  
  <pre><code>   - (NSData *)AESEncryptWithKey:(NSString *)key {
   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];
  
   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 numBytesEncrypted = 0;
   CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
              keyPtr, kCCKeySizeAES128,
              NULL /* 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;
  }
  </code></pre>
  
  <p>And the java encryption code is...</p>
  
  <pre><code>public byte[] encryptData(byte[] data, String key) {
      byte[] encrypted = null;
  
      Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
      byte[] keyBytes = key.getBytes();
  
      SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
  
      try {
          Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
          cipher.init(Cipher.ENCRYPT_MODE, keySpec);
  
          encrypted = new byte[cipher.getOutputSize(data.length)];
          int ctLength = cipher.update(data, 0, data.length, encrypted, 0);
          ctLength += cipher.doFinal(encrypted, ctLength);
      } catch (Exception e) {
          logger.log(Level.SEVERE, e.getMessage());
      } finally {
          return encrypted;
      }
  }
  </code></pre>
  
  <p>The hex output of the objective-c code is -</p>
  
  <pre><code>7a68ea36 8288c73d f7c45d8d 22432577 9693920a 4fae38b2 2e4bdcef 9aeb8afe 69394f3e 1eb62fa7 74da2b5c 8d7b3c89 a295d306 f1f90349 6899ac34 63a6efa0
  </code></pre>
  
  <p>and the java output is -</p>
  
  <pre><code>7a68ea36 8288c73d f7c45d8d 22432577 e66b32f9 772b6679 d7c0cb69 037b8740 883f8211 748229f4 723984beb 50b5aea1 f17594c9 fad2d05e e0926805 572156d
  </code></pre>
  
  <p>As you can see everything is fine up to -</p>
  
  <pre><code>7a68ea36 8288c73d f7c45d8d 22432577
  </code></pre>
  
  <p>I am guessing I have some of the settings different but can't work out what, I tried changing between ECB and CBC on the java side and it had no effect.</p>
  
  <p>Can anyone help!? please....</p>