Определите, неверный ли ключ с помощью 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, если мои данные неправильно расшифровываются, поэтому я предполагаю, что операция расшифровки прошла успешно, просто выдала мусорные данные из-за неправильного ключа.

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


person Kyle Jurick    schedule 30.12.2014    source источник


Ответы (1)


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

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

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

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

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

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

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

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

person zaph    schedule 31.12.2014
comment
Спасибо. Я принимаю пользовательский ввод для создания ключа, поэтому я решил хешировать пользовательский ввод и зашифровать его. Если я расшифрую и хеширую пользовательский ввод, и хэши совпадают, то я, безусловно, успешно расшифровал - person Kyle Jurick; 12.01.2015