Зашифрованные NSData для NSString в obj-c?

У меня есть приложение для iPhone, которое шифрует введенную NSString с использованием CCCrypt (AES256) и открытого текстового ключа. Строка и ключ передаются методу шифрования, который возвращает объект NSData.

Запрос [описание данных], где "данные" являются зашифрованными строковыми данными, дает NSString как: "< 0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a > ", но когда я пытаюсь преобразовать это в NSString, я получаю "( нуль)".

Мне нужно вернуть пользователю NSString, который можно использовать для дешифрования обратно к исходной строке с использованием того же открытого текстового ключа. Если свойство "description" объекта NSData может возвращать строку, можно ли каким-либо образом создать NSString из объекта NSData без получения "(null)"?

ОБНОВЛЕНИЕ: благодаря Куинну, который предлагает использовать кодировку Base64 для создания запутанной строки. Из того, что я понимаю, кодировка Base64 не просто заменяет символы, но обмен символами зависит от позиции, так что отлично.

Моя единственная проблема заключается в том, что я хочу иметь возможность шифровать сообщение с помощью "passphrase" и требовать, чтобы идентичная кодовая фраза вводилась, когда нужно было декодировать запутанную строку - может ли кто-нибудь предложить способы ее реализации?

Ответ 1

Прежде всего, НЕ используйте, используйте -[NSData description] для создания NSString для таких целей. (Лучше рассматривать -description как вывод отладки. Прошу прощения, если мой предыдущий ответ ввел вас в заблуждение, я просто печатал описание, чтобы продемонстрировать, что NSData можно зашифровать и decrypted.) Вместо этого используйте методы NSString -dataUsingEncoding: и -initWithData:encoding: для преобразования между NSData и NSString. Даже при этом обратите внимание, что зашифрованные данные AES, вероятно, не будут хорошо транслироваться в строки как есть - некоторые байтовые последовательности просто не будут хорошо воспроизводиться, поэтому неплохо было бы кодировать данные перед созданием строки.

Я предлагаю вам попробовать Base64 encoding NSData, так как данные Base64 всегда могут быть представлены как строка ASCII. (Конечно, когда вы это сделаете, вам придется декодировать из Base64 перед расшифровкой.)

Вот некоторые полезные ресурсы...


Изменить: Я предполагал, что вы объедините это с моим ответом на ваш предыдущий вопрос по шифрованию AES объектов NSString. Кодирование данных как Base64 не накладывает никаких ограничений на сами данные - это, безусловно, может быть AES-зашифрованные данные. Здесь, что делать, если вы просто хотите вводить и выводить строку:

  • Шифрование
    • Обеспечить шифрование NSString и кодовую фразу, используемую для шифрования.
    • Преобразуйте строку в NSData и выполните шифрование AES (см. предыдущий вопрос).
    • Base64-encode NSData, затем создайте и верните и NSString для кодированного вывода.
  • дешифрование
    • Предоставить зашифрованную и закодированную строку и кодовую фразу, используемую для дешифрования.
    • Создайте NSData из первой строки, затем Base64-декодируйте данные.
    • Выполните дешифрование AES на данных, затем создайте и верните NSString.

На самом деле это всего лишь вопрос объединения двух частей вместе и выполнения их в обратном направлении на выходе. Из моего предыдущего ответа вы можете изменить encryptString:withKey:, чтобы выполнить последний шаг и вернуть строку, и изменить decryptData:withKey: как decryptString:withKey: и принять две строки. Это довольно просто.

Ответ 2

Я собрал полный набор категорий для NSData и NSString для обеспечения шифрования AES256 для строк.

Подробнее см. мой ответ по "оригинальному" вопросу.