Как загрузить ключ и зашифровать с помощью RSA Swift

Как вы можете загрузить открытый или закрытый ключ из файла, а затем зашифровать или расшифровать данные с его помощью в Swift, не используя библиотеки или API?


person Bennett    schedule 01.08.2015    source источник
comment
это для iOS или OSX? Кроме того, почему ограничение на отсутствие библиотек или API? Если вы хотите зашифровать, вам придется использовать некоторую библиотеку или API.   -  person Michael Dautermann    schedule 01.08.2015
comment
@MichaelDautermann Либо. Почему?   -  person Bennett    schedule 01.08.2015
comment
Почему? Я не был уверен, на что ты нацелился. И я собирался предложить использовать какую-то библиотеку или библиотеку openssl, но потом я заметил, что вы не используете библиотеки или комментарии API, поэтому я чувствую, что мои руки связаны, чтобы дать вам ответ.   -  person Michael Dautermann    schedule 01.08.2015


Ответы (2)


Вы можете использовать встроенный в OS X OpenSSL для генерации и шифрования или комбинацию OS X и Swift.

Команды OpenSSL:

  1. openssl genrsa -out rsaPrivateKey.pem 4096 (скорее всего, 2048 тоже подойдет — выбор дилера)
  2. openssl rsa -in rsaPrivateKey.pem -out rsaPrivateKey.key
  3. openssl req -new -key rsaPrivateKey.key -out rsaCertReq.crt (для этого шага требуется основная информация, а iOS требует пароль, поэтому установите его, когда он запросит)
  4. openssl x509 -req -days 10000 -in rsaCertReq.crt -signkey rsaPrivateKey.key -out rsaCert.crt
  5. openssl x509 -outform der -in rsaCert.crt -out publicKey.der
  6. openssl pkcs12 -export -out privateKey.pfx -inkey rsaPrivateKey.key -in rsaCert.crt

В конце концов, важные файлы с точки зрения iOS — это publicKey.der и privateKey.pfx. Вы будете использовать publicKey.der для шифрования данных и privateKey.pfx для расшифровки.


Шифрование в iOS

В iOS, в дополнение к функциям поддержки кодирования и декодирования ключей, API сертификатов, ключей и служб доверия также обеспечивает базовое шифрование, дешифрование, подписание и проверку блоков данных с использованием следующих функций SecKey:

SecKeyEncrypt — шифрует блок данных с помощью указанного ключа.

SecKeyDecrypt — расшифровывает блок данных с помощью указанного ключа.

SecKeyRawSign — подписывает блок данных с помощью указанного ключа.

SecKeyRawVerify – проверяет подпись на соответствие блоку данных и указанному ключу.

Apple Docs
Шифрование и хеширование данных

Примеры использования этих функций можно найти в документации Apple Сертификат, ключ и задачи службы доверия для iOS

import UIKit
import CoreFoundation

Используйте заголовочный файл моста для Security.h

#import <Security/Security.h>
person Edison    schedule 01.08.2015
comment
... вы, вероятно, также можете вызвать libCrypto из Swift, если вы не ищете решение для командной строки - person nielsbot; 01.08.2015
comment
@tymac Хорошо, как мне зашифровать данные в Swift? - person Bennett; 01.08.2015

Хорошо, я провел для вас небольшое исследование, и вот что я придумал (на основе ответов, которые я вижу в это связанный вопрос).

Существует проект GitHub с открытым исходным кодом в Swift под названием Heimdall, который является хорошей оболочкой для системы безопасности Apple. В ReadMe на странице GitHub написано «Swift 1.2», но Xcode 7 и Swift 2.0 будут завершены в любой день, так что, надеюсь, они скоро будут обновлены.

Если вы хотите пропустить использование материалов с открытым исходным кодом, вам нужно напрямую обратиться к системе безопасности Apple. Найдите этот пример кода, который включает следующие вызовы: SecKeyEncrypt и SecKeyDecrypt.

Эти два вызова (и все в SecKey.h) кажутся функциями C, но документация Apple, на которую я ссылался, похоже, указывает на то, что может быть доступен Swift API.

person Michael Dautermann    schedule 01.08.2015
comment
API-интерфейсы есть везде, но OP не хочет использовать API/фреймворк, а Heimdall — это API. Он может создавать пары ключей RSA, используя цепочку ключей iOS/OS X для хранения ключей, поэтому ключи хранятся безопасным способом, НО опять же это API. CkoRsa — это еще один API. - person Edison; 01.08.2015
comment
@tymac Разговаривал с ним в ОП. Меня это устраивает, и функции SecKeyEncrypt и SecKeyDecrypt приятны. - person Bennett; 02.08.2015