Попробуй это .. У меня сработало.
NSData *data = [NSString dataUsingEnconding:NSASCIIStringEncoding];
NSData *key = [self create3DesKey]; //This should be 24 characters, or 24 bytes
const void *vplainText;
size_t plainTextBufferSize;
plainTextBufferSize = [data length];
vplainText = (const void *)[data bytes];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t movedBytes = 0;
bufferPtr = (uint8_t *) malloc( [data length] * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, [data length]);
NSString *initVec = @"init_Vec";
const void *vkey = (const void *) [key bytes];
const void *vinitVec = (const void *) [initVec UTF8String];
ccStatus = CCCrypt(kCCEncrypt,//encryptOrDecrypt,
kCCAlgorithm3DES,
plainTextBufferSize % 8 == 0 ? kCCOptionECBMode : KCCOptionPKCS7PAdding , //
vkey, //this should 24 bytes from 0x00 to 0xFF
kCCKeySize3DES,
vinitVec, //"init Vec", //iv,
vplainText, //This should be a multiple of 8 bytes or you will have to use KCCOptionPKCS7PAdding
plainTextBufferSize,
(void *)bufferPtr,
[data length],
&movedBytes);
NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [myData base64Encoding];
NSLog(@"%@", result);
Эту функцию следует использовать для правильного создания ключа:
-(NSData*)create3DesKey
{
NSMutableData *mData = [[NSMutableData alloc] init];
NSMutableData *mAuxData = [[NSMutableData alloc] init];
for(int i = 0; i < 16; ++i)
{
u_int32_t aux = arc4random() % 255;
[mData appendBytes:&aux length:1];
if(i < 8)
{
[mAuxData appendBytes:&aux length:1];
}
}
[mData appendData:mAuxData];
return mData;
}
Я сам с этим работал. Обратите внимание, что функция createkey создает ключ EDE, в котором говорится, что первые 8 байтов ключа в точности равны 8 последним байтам. Можно также создать таким образом, чтобы все 3 блока по 8 байтов были одинаковыми или совершенно разными. Вы должны проверить, какой из них обрабатывает ваш сервер.
Надеюсь, это поможет.