2016-12-19 3 views
6

настоящее время я использую следующие для Triple DES дешифрования на прошивкой:Triple DES дешифрования в прошивкой

NSString* plainText = @"My Text"; 
    NSString* keyText = @"cf6f1ed3bf0a156e"; 

    NSData *plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *keyData = [keyText dataUsingEncoding:NSUTF8StringEncoding]; 

    size_t bufferSize = plainData.length + kCCBlockSize3DES; 
    NSMutableData *cypherData = [NSMutableData dataWithLength:bufferSize]; 
    size_t movedBytes = 0; 

    CCCryptorStatus ccStatus; 
    ccStatus = CCCrypt(kCCDecrypt, 
      kCCAlgorithm3DES, 
      kCCOptionECBMode, 
      keyData.bytes, 
      kCCBlockSize3DES, 
      NULL, 
      plainData.bytes, 
      plainData.length, 
      cypherData.mutableBytes, 
      cypherData.length, 
      &movedBytes); 

    cypherData.length = movedBytes; 

    if(ccStatus == kCCSuccess) { 
     NSLog(@"Data: %@",cypherData); 
     NSLog(@"Data encoded string: %@",[NSString stringWithUTF8String:[cypherData bytes]]); 
     NSLog(@"Data encoded: %@",[[NSString alloc] initWithData:cypherData encoding:NSUTF8StringEncoding]); 
    } else { 
     NSLog(@"Failed DES decrypt ..."); 
     return nil; 
    } 

Однако, я получаю следующее в консоли:

данных: данных кодированная строка: (null) Закодированные данные: (null)

Любые идеи относительно того, почему это происходит? Может ли кто-нибудь увидеть какие-либо возможные проблемы с этим кодом?

ответ

2

Изменить сообщение отказ:

NSLog(@"Failed DES decrypt, status: %d", ccStatus); 

Вы увидите -4300 статус и посмотреть, что в CommonCryptoError.h найти:
kCCParamError = -4300
@constant kCCParamError Illegal parameter value.

ошибки состояния может быть вашим другом, если вы не игнорируйте их.

  1. Вы указываете 3DES, который должен иметь длину ключа 24 байта, вы поставляете 16 байтов. Вероятно, вам лучше перейти на kCCAlgorithmDES и kCCBlockSizeDES (см. Следующий пункт). Но ключ может быть закодирован в шестнадцатеричном виде и должен быть декодирован до 8 байтов.

  2. При вызове 5-й параметр: size_t keyLength, но вы задаете kCCBlockSize3DES который составляет 8-байтовый. Размер ключа и блока не обязательно одинакового размера.

  3. Нет набивка по умолчанию, и это означает, что данные будут зашифрованы должны быть точным кратен размеру блока (8-байт). Либо добавьте еще один байт во входные данные, либо укажите kCCOptionPKCS7Padding в качестве опции.

  4. В общем случае невозможно выразить результат шифрования непосредственно в символьной строке, в частности, не в представлении UTF-8 - есть значения байтов, которые не отображаются. По этой причине, если вам нужна кодировка символьной строки, как правило, используются Base64 или hexadecimal.

Примечание: Существует возможность ключ 16 байт и два ключа нужен 3DES, в этом случае дублировать и добавить первые 8 байт на ключ, чтобы сделать это 24-байтовое 3DES ключ , Вам нужно понять алгоритм, ключ и варианты.

Этот пример кода работает, но не является ни оптимальным, ни безопасным, но отправная точка, чтобы ты:

Вы можете изменить это 3DES путем подачи ключа в 24-байтовый и изменения kCCAlgorithmDES к kCCAlgorithm3DES и kCCKeySizeDES к kCCKeySize3DES

NSString* plainText = @"My Text-"; 
NSString* keyText = @"cf6f1ed3"; 

NSData *plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *keyData = [keyText dataUsingEncoding:NSUTF8StringEncoding]; 

size_t bufferSize = plainData.length + kCCBlockSizeDES; 
NSMutableData *cypherData = [NSMutableData dataWithLength:bufferSize]; 
size_t movedBytes = 0; 

CCCryptorStatus ccStatus; 
ccStatus = CCCrypt(kCCDecrypt, 
        kCCAlgorithmDES, 
        kCCOptionECBMode, 
        keyData.bytes, 
        kCCKeySizeDES, 
        NULL, 
        plainData.bytes, 
        plainData.length, 
        cypherData.mutableBytes, 
        cypherData.length, 
        &movedBytes); 

cypherData.length = movedBytes; 

if(ccStatus == kCCSuccess) { 
    NSLog(@"Data: %@"encoded,cypherData); 
} else { 
    NSLog(@"Failed DES decrypt, status: %d", ccStatus); 
} 

но по соображениям безопасности использует AES со случайным IV, если это возможно использование RNCryptor, он будет заботиться о всех противных, но важных деталях для вас.

+0

никогда бы не подумал о проблемах с ключами. Спасибо за помощь – user481610

3

Ваш ключ длиной 16 байт. 3DES берет ключ длиной 24 байта (спасибо Zaph за исправление, также отметив, что вы читаете только 8 байтов). Это может не вызвать эту ошибку, но означает, что ключ не тот, который вы так считаете.

Ряд шестнадцатеричных цифр в строке - это всего лишь значения UTF-8. «00» не 0x00, 0x00. Это 0x30, 0x30.

Причина вы получаете (null) вот это:

NSLog(@"Data encoded string: %@",[NSString stringWithUTF8String:[cypherData bytes]]); 

Cryptographic выход вряд ли будет правовой UTF-8 строку. Если вы хотите кодировать случайные данные в виде строки, вам нужна кодировка, такая как шестнадцатеричное кодирование или кодировка Base64. Base64 встроен, и вы можете использовать [NSData base64EncodedStringWithOptions:] для его кодирования.

Смежные вопросы