Шифрование AES для NSString на iPhone

Поскольку Konrad сказал, что компилятор может создать Таблицу переходов.

В C++ причина это банка из-за ограничения переключателей.

123
задан Quinn Taylor 9 September 2009 в 19:16
поделиться

1 ответ

Поскольку вы не опубликовали никакого кода, трудно точно определить, с какими проблемами вы столкнулись. Однако сообщение в блоге, на которое вы ссылаетесь, похоже, работает довольно прилично ... за исключением дополнительной запятой в каждом вызове CCCrypt () , который вызывал ошибки компиляции.

Более поздний комментарий к этому сообщению включает это адаптированный код , который работает для меня и кажется немного более простым. Если вы включите их код для категории NSData, вы можете написать что-то вроде этого: (Примечание: вызовы printf () предназначены только для демонстрации состояния данных в различных точках - в реальном приложении это не имеет смысла печатать такие значения.)

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *key = @"my password";
    NSString *secret = @"text to encrypt";

    NSData *plain = [secret dataUsingEncoding:NSUTF8StringEncoding];
    NSData *cipher = [plain AES256EncryptWithKey:key];
    printf("%s\n", [[cipher description] UTF8String]);

    plain = [cipher AES256DecryptWithKey:key];
    printf("%s\n", [[plain description] UTF8String]);
    printf("%s\n", [[[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding] UTF8String]);

    [pool drain];
    return 0;
}

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

- (NSData*) encryptString:(NSString*)plaintext withKey:(NSString*)key {
    return [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key];
}

- (NSString*) decryptData:(NSData*)ciphertext withKey:(NSString*)key {
    return [[[NSString alloc] initWithData:[ciphertext AES256DecryptWithKey:key]
                                  encoding:NSUTF8StringEncoding] autorelease];
}

Это определенно работает на Snow Leopard, а @Boz сообщает, что CommonCrypto является частью ядра ОС на iPhone. И 10.4, и 10.5 имеют / usr / include / CommonCrypto , хотя в 10.5 есть справочная страница для CCCryptor.3cc , а в 10.4 нет, поэтому YMMV.


РЕДАКТИРОВАТЬ: ] См. следующий вопрос об использовании кодировки Base64 для представления байтов зашифрованных данных в виде строки (при желании) с использованием безопасных преобразований без потерь.

127
ответ дан 24 November 2019 в 01:16
поделиться