Может ли кто-нибудь указать мне в правильном направлении, чтобы иметь возможность зашифровать строку, возвращая другую строку с зашифрованными данными? (Я пробовал использовать шифрование AES256.) Я хочу написать метод, который принимает два экземпляра NSString, один из которых представляет собой сообщение для шифрования, а другой - «код доступа» для его шифрования - я подозреваю, что мне придется сгенерировать ключ шифрования с паролем, который можно отменить, если код доступа предоставляется вместе с зашифрованными данными. Затем метод должен вернуть NSString, созданный из зашифрованных данных.
Я пробовал технику, описанную в первом комментарии к этому посту , но пока мне не повезло. В CryptoExercise от Apple определенно что-то есть, но я не могу понять этого ... Я видел много ссылок на CCCrypt , но он терпел неудачу во всех случаях, когда я его использовал.
Мне также нужно было бы расшифровать зашифрованную строку, но я надеюсь, что это так же просто, как kCCEncrypt / kCCDecrypt.
Ответы:
Поскольку вы не разместили код, трудно точно определить, с какими проблемами вы столкнулись. Тем не менее, сообщение в блоге, на которое вы ссылаетесь, похоже, работает довольно прилично ... за исключением дополнительной запятой в каждом вызове,
CCCrypt()
вызывающем ошибки компиляции.Более поздний комментарий к этому сообщению включает этот адаптированный код , который работает для меня и кажется немного более простым. Если вы включите их код для категории NSData, вы можете написать что-то вроде этого: (Примечание:
printf()
вызовы предназначены только для демонстрации состояния данных в различных точках - в реальном приложении не имеет смысла печатать такие значения .)Учитывая этот код и тот факт, что зашифрованные данные не всегда хорошо переводятся в NSString, может быть удобнее написать два метода, которые обертывают нужную вам функциональность в прямом и обратном направлениях ...
Это определенно работает в Snow Leopard, и @Boz сообщает, что CommonCrypto является частью Core OS на iPhone. И 10.4, и 10.5 имеют
/usr/include/CommonCrypto
, хотя в 10.5 есть справочная страница,CCCryptor.3cc
а в 10.4 нет, поэтому YMMV.РЕДАКТИРОВАТЬ: См. Следующий вопрос об использовании кодировки Base64 для представления байтов зашифрованных данных в виде строки (при желании) с использованием безопасных преобразований без потерь.
источник
autorelease
.Я собрал коллекцию категорий для NSData и NSString, в которых используются решения, найденные в блоге Джеффа Ламарче, и некоторые подсказки Куинна Тейлора здесь, в Stack Overflow.
Он использует категории для расширения NSData для обеспечения шифрования AES256, а также предлагает расширение NSString для безопасного кодирования зашифрованных данных в строки с помощью BASE64.
Вот пример, показывающий использование для шифрования строк:
Получите полный исходный код здесь:
Спасибо за все полезные советы!
-- Майкл
источник
@owlstead, относительно вашего запроса на «криптографически безопасный вариант одного из данных ответов», пожалуйста, обратитесь к RNCryptor . Он был разработан, чтобы делать именно то, что вы запрашиваете (и был построен в ответ на проблемы с кодом, перечисленным здесь).
RNCryptor использует PBKDF2 с солью, предоставляет случайный IV и присоединяет HMAC (также сгенерированный из PBKDF2 с его собственной солью. Он поддерживает синхронные и асинхронные операции.
источник
Я немного подождал, пока @QuinnTaylor обновит его ответ, но, поскольку он этого не сделал, вот ответ немного более четко и таким образом, чтобы он загрузился в XCode7 (и, возможно, больше). Я использовал это в приложении Какао, но он, вероятно, будет работать и с приложением iOS. Нет ошибок ARC.
Вставьте перед любым разделом @implementation в файле AppDelegate.m или AppDelegate.mm.
Вставьте эти две функции в нужный вам класс @implementation. В моем случае я выбрал @implementation AppDelegate в моем файле AppDelegate.mm или AppDelegate.m.
источник
dataWithBytesNoCopy
просто выделитьNSMutableData
сdataWithLength
и использоватьmutableBytes
свойство для указателя байта , а затем просто изменить размер, установив этоlength
свойство. 3. Использование строки напрямую для шифрования очень небезопасно, следует использовать производный ключ, такой как созданный PBKDF2.keyData.length = kCCKeySizeAES256;
.https://github.com/muneebahmad/AESiOSObjC
источник