2014-12-30 5 views
-1

Я работаю над включением шифрования для данных, хранящихся в моем приложении. Я получил довольно далеко, поскольку я шифрую и дешифруя данные, моя проблема в том, что я не могу заставить очевидную ошибку дешифрования, когда используется неправильный ключ. Моя расшифровывать функция:Определите, является ли ключ неправильным с CCCrypt kCCOptionPKCS7Padding-Objective C

+ (NSData *)decryptedDataForData:(NSData *)data 
        password:(NSString *)password 
          iv:(NSData *)iv 
         salt:(NSData *)salt 
         error:(NSError **)error { 
NSAssert(iv, @"IV must not be NULL"); 
NSAssert(salt, @"salt must not be NULL"); 

NSData *key = [self AESKeyForPassword:password salt:salt]; 

size_t outLength; 
NSMutableData * 
decryptedData = [NSMutableData dataWithLength:data.length]; 

CCCryptorStatus 
result = CCCrypt(kCCDecrypt, 
       kAlgorithm, 
       kCCOptionPKCS7Padding, 
       key.bytes, 
       key.length, 
       iv.bytes, 
       data.bytes, 
       data.length, 
       decryptedData.mutableBytes, 
       decryptedData.length, 
       &outLength); 

if (result == kCCSuccess) { 
    decryptedData.length = outLength; 
} 
else { 
    if (error) { 
     *error = [NSError errorWithDomain:kRNCryptManagerErrorDomain 
            code:result 
           userInfo:nil]; 
    } 
    return nil; 
} 

return decryptedData; 

}

Это взято из http://robnapier.net/aes-commoncrypto для справки.

Согласно документации CCCrypt, я должен получить kCCDecodeError, если мои данные не дешифруются должным образом, поэтому я предполагаю, что операция дешифрования была успешной, просто дал данные мусора из-за неправильного ключа.

Итак, что лучше всего подходит для определения того, был ли правильный ключ использован для дешифрования данных?

ответ

0

kCCDecodeError не содержит информации, если используется правильный ключ, только если имеются грубые ошибки.

Единственный способ узнать правильность ключа - проверить выход. Вывод может быть проверен в целом или с помощью хэша или другой проверки, например, зная, что это должен быть хороший результат, который имеет смысл в некотором роде.

Ответ на лучшую практику, чтобы определить, если ключ был правильным:

  1. Это не является функцией шифрования и имея такой метод снижает безопасность, по существу, обеспечивая кроватку злоумышленнику. См. Known-plaintext attack.

  2. Помимо запуска атаки, вы знаете правильный ключ и используете его.

  3. Если вам нужно определить, что дешифрование было правильным, добавьте что-то, что можно проверить, например хэш данных или магическое значение, и убедитесь, что при расшифровке. См. Выше.

  4. Для безопасной аутентификации см один из нескольких ссылок, таких как Applied Cryptography Брюс Шнайер, Практическая криптография Нильса Фергюсон, Брюс Шнайер, Справочник по прикладной криптографии и многое другое.

В общем, если вы хотите, чтобы настоящая служба безопасности криптографического эксперта домена.

+0

Спасибо. Я беру пользовательский ввод, чтобы создать ключ, поэтому я решил хэш-вход пользователя и зашифровал его. Если я дешифровать и хешировать пользовательский вход и хеши, то я, конечно, успешно расшифровал –

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

  • Нет связанных вопросов^_^