Шифрование 3DES отличается на iPhone и сервере

У меня есть следующий код для шифрования запроса, который я отправляю на свой сервер. Декодирование на сервере выполняется .NET, а на iPhone я использую структуру безопасности со следующим кодом.

- (NSString*) doCipher:(NSString*)plainText:(CCOperation)encryptOrDecrypt {

const void *vplainText;
size_t plainTextBufferSize;

if (encryptOrDecrypt == kCCDecrypt)
{
    NSData *EncryptData = [[NSData alloc] initWithBase64EncodedString:plainText];
    plainTextBufferSize = [EncryptData length];
    vplainText = [EncryptData bytes];
}
else
{
    plainTextBufferSize = [plainText length];
    vplainText = (const void *) [plainText UTF8String];
}

CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
// uint8_t iv[kCCBlockSize3DES];

uint8_t iv[kCCBlockSize3DES];
memset((void *) iv, 0x0, (size_t) sizeof(iv));

bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
// memset((void *) iv, 0x0, (size_t) sizeof(iv));

NSString *key = @"D3v3lop_4pp13_f0r_M4z4Y4";
const void *vkey = (const void *) [key UTF8String];

ccStatus = CCCrypt(encryptOrDecrypt,
                   kCCAlgorithm3DES,
                   kCCOptionPKCS7Padding,
                   vkey, //"123456789012345678901234", //key
                   kCCKeySize3DES,
                   iv, //"init Vec", //iv,
                   vplainText, //"Your Name", //plainText,
                   plainTextBufferSize,
                   (void *)bufferPtr,
                   bufferPtrSize,
                   &movedBytes);
if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
else if (ccStatus == kCCParamError) return @"PARAM ERROR";
else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";
else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";
else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";
else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";
else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED";

NSString *result;

if (encryptOrDecrypt == kCCDecrypt)
{
    result = [[ [NSString alloc] initWithData: [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding] autorelease];
}
else
{
    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    result = [myData base64Encoding];   
}    
return result;
}    

Шифрование на сервере и на iPhone дает одинаковый результат, если длина зашифрованной строки меньше 8 символов! после этого он дает другие результаты. Я новичок в этом вопросе, есть ли намёк на то, где искать?


person Adhamox    schedule 25.08.2011    source источник
comment
Удалось ли вам выяснить причину проблемы?   -  person yoninja    schedule 12.12.2013


Ответы (1)


Да, у вас разные режимы шифрования и / или заполнение. Убедитесь, что вы используете один и тот же режим как на сервере, так и на клиенте. Например, в большинстве случаев хорошим выбором является режим CBC с заполнением PKCS # 7.

Есть ли какая-то конкретная причина, по которой вы используете 3DES? Он значительно медленнее, чем AES (с чуть худшими характеристиками).

person Yann Ramin    schedule 25.08.2011
comment
Спасибо за быстрый ответ. Адаптирую приложение под уже построенный серверный API. Я где-то читал здесь, в stackoverflow, что PKCS5 и PKCS7 одинаковы. Сервер использует PKCS5. может это быть причиной? - person Adhamox; 25.08.2011
comment
PKCS5 и PKCS7 фактически одно и то же, просто PKCS5 определен только для блоков размером до 64 бит, а PKCS7 определен для блоков размером до 128 бит. В остальном они идентичны. - person rossum; 25.08.2011
comment
@Adhamox: Может, попробуем режим CTR или (вздрогнув) ECB для взаимодействия? - person Yann Ramin; 26.08.2011
comment
Вы правы, когда вздрагиваете от режима ECB, избегайте его, если это вообще возможно. CBC или CTR намного лучше и безопаснее. - person rossum; 28.08.2011