Шифрование в iPhone с 3DES - PullRequest
0 голосов
/ 28 марта 2012

Мне нужно зашифровать NSString с 3DES, и я не могу это сделать. Это возвращает мне большую NSString в результате:

ccStatus = CCCrypt(kCCEncrypt,
                   kCCAlgorithm3DES,
                   kCCOptionECBMode | kCCOptionPKCS7Padding ,
                   vkey, //"123456789012345678901234", //key
                   kCCKeySize3DES,
                   vinitVec,// vinitVec, //"init Vec", //iv,
                   vplainText, //"Your Name", //plainText,
                   plainTextBufferSize,
                   (void *)bufferPtr,
                   bufferPtrSize,
                   movedBytes);

NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [myData base64Encoding];

NSLog(@"%@", result);

1 Ответ

2 голосов
/ 29 марта 2012

Попробуй это .. У меня сработало.

    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 байтов были одинаковыми или совершенно разными. Вы должны проверить, какой из них обрабатывает ваш сервер.

Надеюсь, это поможет.

...