Какао шифрование обычного текста? - PullRequest
1 голос
/ 27 июня 2011

Я работаю над приложением для шифрования, которое сейчас шифрует только текстовые файлы.Мне нужна помощь в соединениях и как использовать шифрование.Я получил этот фрагмент кода для шифрования файла, но я немного запутался.Что мне нужно сделать, это иметь кнопку (шифровать), которая берет этот текстовый файл и шифрует его.Должен ли я сначала извлечь содержимое файла, а затем зашифровать его?Как так?Программа должна знать, какой файл был выбран, поэтому она его зашифровывает, и я сейчас полный нуб, и мне нужна помощь.

Будем весьма благодарны пошаговые инструкции.

Это был код:

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

Я реализовал средство выбора файлов со следующим фрагментом:

- (IBAction)fileChooser:(id)sender {
    int i;
    NSOpenPanel* openDlg = [NSOpenPanel openPanel];
    [openDlg setCanChooseFiles:YES];
    [openDlg setCanChooseDirectories:YES];
    [openDlg setPrompt:@"Select"];
    if ([openDlg runModalForDirectory:nil file:nil] == NSOKButton )
    {
        NSArray* files = [openDlg filenames];
        for( i = 0; i < [files count]; i++ )
        {
            [files objectAtIndex:i];

        }

    }
}

1 Ответ

1 голос
/ 27 июня 2011

Это был код:

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

Сначала посмотрите на получателя сообщения AES256EncryptWithKey:. Это еще одно вложенное сообщение:

[plaintext dataUsingEncoding:NSUTF8StringEncoding]

Что такое plaintext? Это объявлено в вашем encryptString:withKey: методе: это переменная, содержащая указатель на строку NSString.

Итак, вы отправляете сообщение dataUsingEncoding: экземпляру NSString.

Это хорошо, если вы намереваетесь зашифровать какой-либо простой текстовый ввод пользователя, но это не так хорошо для шифрования файлов. NSStrings для ничего, кроме человеческих персонажей; пользователь, вероятно, захочет зашифровать файлы, которые не являются простым текстом, например изображения и видеофайлы.

Я знаю, что вы сказали, что ваше приложение «на данный момент шифрует только текстовые файлы», но решение на самом деле проще, когда вы снимаете это ограничение.

Так что вам нужно зашифровать любые данные, а не только строку. Удалите ваш encryptString:withKey: метод - он бесполезен.

Из реализации этого позднего метода мы знаем, что вы отправляли AES256EncryptWithKey: объекту, полученному отправкой dataUsingEncoding: в экземпляр NSString.

Если вы посмотрите в документацию для NSString , вы увидите , что dataUsingEncoding: возвращает . Спойлер: возвращает объект NSData.

Отсюда одна гиперссылка на документацию NSData , где вы найдете две вещи:

  1. У него нет метода с помощью селектора AES256EncryptWithKey:.
  2. У него есть методы для создания объекта данных из содержимого файла. (Я дам вам их найти.)

Я предполагаю, что вы знали # 1 и скачали реализацию категории откуда-то. Я также предполагаю, что на самом деле эта категория равна в NSData; категория @interface в заголовке скажет вам.

В Objective-C вы не должны использовать цикл индексации для итерации массива, если вам действительно не нужен индекс для чего-то, чего обычно нет, а в частности нет. Вместо этого используйте быстрое перечисление :

for (NSString *path in [openPanel filenames]) {
}

Вы можете видеть, как это опять упрощает решение. Это также быстрее.

Внутри этого цикла передайте этот путь методу класса NSData, который создает объект NSData из содержимого файла. Затем отправьте этому объекту данных сообщение AES256EncryptWithKey:, чтобы получить зашифрованный текст, который вы, вероятно, должны записать в отдельный файл. Я отсылаю вас обратно к документации NSString для методов манипулирования путями, которые вам понадобятся для вычисления пути к выходному файлу, и к документации NSData для метода, который вам понадобится для записи данных зашифрованного текста в выходной файл.

...