2013-12-09 3 views
0

У меня есть некоторые методы класса шифрования и дешифрования в моем приложении. Я могу шифровать «данные», используя «ключ», и он отлично работает. Я могу записать эти данные на диск, а затем прочитать данные позже с помощью приложения и вызвать decryptWithKey для дешифрования блока данных. Все отлично работает. Однако, если я включу этот файл класса .m в другое приложение, скомпилируйте это приложение и попытайтесь расшифровать те же самые данные, которые были зашифрованы с помощью первого приложения, вызов CCCrypt (расшифровка) завершился неудачно ... ну, а не точно, он возвращает Success но данные не дешифруются. Я сравнил данные и ключевые значения в обоих приложениях, и они идентичны, вплоть до байта.Ошибка CCCrypt при расшифровке в другом приложении

Любые идеи?

+(BOOL)encryptWithKey:(NSMutableData*)data withKey:(NSString *)key 
{ 
    CCCryptorStatus result = kCCSuccess; 

    @try 
    { 
     char keyPtr1[kCCKeySizeAES256+1]; // room for terminator (unused) 
     bzero(keyPtr1, sizeof(keyPtr1)); // fill with zeroes (for padding) 
     [key getCString: keyPtr1 maxLength: sizeof(keyPtr1) encoding: NSUTF8StringEncoding]; 
     size_t numBytesEncrypted = 0; 
     size_t dataInLength = [data length]; 
     size_t dataOutLength = 18*dataInLength; 

     [data setLength:dataOutLength]; 
     result = CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding, 
             (const void*)keyPtr1, kCCKeySizeAES256, 0 /* initialization vector (optional) */, 
             [data mutableBytes], dataInLength, /* input */ 
             [data mutableBytes], dataOutLength, /* output */ 
             &numBytesEncrypted); 
     [data setLength:numBytesEncrypted]; 
    } 
    @catch (NSException *exception) 
    { 
     WDCATCH(exception); 

    } 
    return (result == kCCSuccess); 
} 

+(BOOL)decryptWithKey:(NSMutableData*)data plaintext:(NSString**)plaintext withKey:(NSString *)key 
{ 
    CCCryptorStatus result = kCCSuccess; 

    @try 
    { 
     // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
     char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
     char szPlaintext[1024]={0}; 
     bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 
     [key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF8StringEncoding]; 
     size_t numBytesEncrypted = 0; 

     result = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
         (const void*)keyPtr, kCCKeySizeAES256, 
         0 /* initialization vector (optional) */, 
         [data mutableBytes], [data length], /* input */ 
         szPlaintext,1024,// [data mutableBytes], dataOutLength, /* output */ 
         &numBytesEncrypted); 
     if (result == kCCSuccess) 
     { 
      szPlaintext[numBytesEncrypted] = 0; 
      *plaintext = [[NSString alloc] initWithFormat:@"%s",szPlaintext]; 
     } 
    } 
    @catch (NSException *exception) 
    { 
     WDCATCH(exception); 

    } return (result == kCCSuccess); 
} 
+0

Обратите внимание, что приведенный выше код крайне небезопасен (подробнее см. Http://robnapier.net/blog/aes-commoncrypto-564). «18 * dataInLength» также очень странно. В лучшем случае это должно быть 'dataInLength + 16', но это должно все еще работать (оно слишком велико). Странно, что вы шифруете необработанные данные, но затем планируете расшифровать строку ASCII (даже не UTF-8). Когда вы говорите, что дешифрование завершилось с ошибкой, 'numBytesEncrypted' больше 0? Возможно, преобразование% s ASCII не выполняется (хотя тогда вы должны получить мусор). Когда вы говорите «не расшифровать», каков фактический симптом? –

+0

после выполнения CCCrypt (kCCDecrypt), numBytesEncrypted (который должен быть переименован в numBytesDecrypted), равен 0, szPlainText пуст, а result = 0/kCCSuccess. – WebDrive

+0

Я уже несколько раз заглядывал, и похоже, что это может иметь какое-то отношение к приложению «A», приложение Encrypting, предназначено для OSX 10.7 deploy/baseSDK и приложения «B», приложение для дешифрования, предназначено для развертывания OSX 10.9/BaseSDK; @RobNapier, может ли это вызвать проблемы? – WebDrive

ответ

0

Я не эксперт Objective-C, но char szPlaintext[1024]={0}; в decryptWithKey кажется очень подозрительным ко мне. Сначала вы выделяете 1024 байта, но тогда вы назначаете указатель на массив, содержащий элемент 0? Генерация plaintext в виде строки выглядит довольно подозрительной, но она, вероятно, работает для открытого текста ASCII (?).

+0

the = {0}; в объявлении будет инициализироваться весь буфер до нуля/0, аналогично bzero или memset – WebDrive

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