title: iPhone 3DES encryption key length issue
body: <p>I have been banging my head on a wall with this one. I need to code my iPhone application to encrypt a 4 digit "pin" using 3DES in ECB mode for transmission to a webservice which I believe is written in .NET.</p>
  
  <pre><code>+ (NSData *)TripleDESEncryptWithKey:(NSString *)key dataToEncrypt:(NSData*)encryptData {
  NSLog(@"kCCKeySize3DES=%d", kCCKeySize3DES);
  char keyBuffer[kCCKeySize3DES+1]; // room for terminator (unused)
  bzero( keyBuffer, sizeof(keyBuffer) ); // fill with zeroes (for padding)
  
  [key getCString: keyBuffer maxLength: sizeof(keyBuffer) encoding: NSUTF8StringEncoding];
  
  // encrypts in-place, since this is a mutable data object
  size_t numBytesEncrypted = 0;
  
  size_t returnLength = ([encryptData length] + kCCBlockSize3DES) &amp; ~(kCCBlockSize3DES - 1);
  
  // NSMutableData* returnBuffer = [NSMutableData dataWithLength:returnLength];
  char* returnBuffer = malloc(returnLength * sizeof(uint8_t) );
  
  CCCryptorStatus ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES , kCCOptionECBMode,
                                   keyBuffer, kCCKeySize3DES, nil,
                                   [encryptData bytes], [encryptData length], 
                                   returnBuffer, returnLength,
                                   &amp;numBytesEncrypted);
  
  if (ccStatus == kCCParamError) NSLog(@"PARAM ERROR");
  else if (ccStatus == kCCBufferTooSmall) NSLog(@"BUFFER TOO SMALL");
  else if (ccStatus == kCCMemoryFailure) NSLog(@"MEMORY FAILURE");
  else if (ccStatus == kCCAlignmentError) NSLog(@"ALIGNMENT");
  else if (ccStatus == kCCDecodeError) NSLog(@"DECODE ERROR");
  else if (ccStatus == kCCUnimplemented) NSLog(@"UNIMPLEMENTED");
  
  if(ccStatus == kCCSuccess) {
      NSLog(@"TripleDESEncryptWithKey encrypted: %@", [NSData dataWithBytes:returnBuffer length:numBytesEncrypted]);
      return [NSData dataWithBytes:returnBuffer length:numBytesEncrypted];
  }
  else 
      return nil;
  } }
  </code></pre>
  
  <p>I do get a value encrypted using the above code, however it does not match the value from the .NET web service. </p>
  
  <p>I believe the issue is that the encryption key I have been supplied by the web service developers is 48 characters long.</p>
  
  <p>I see that the iPhone SDK constant "kCCKeySize3DES" is 24. So I SUSPECT, but don't know, that the commoncrypto API call is only using the first 24 characters of the supplied key.</p>
  
  <p>Is this correct?</p>
  
  <p>Is there ANY way I can get this to generate the correct encrypted pin? I have output the data bytes from the encryption PRIOR to base64 encoding it and have attempted to match this against those generated from the .NET code (with the help of a .NET developer who sent the byte array output to me). Neither the non-base64 encoded byte array nor the final base64 encoded strings match.</p>