PublicKey из iOS не поддерживается OpenSSL - PullRequest
2 голосов
/ 07 августа 2011

Я создал пару ключей на iOS с использованием SecKeyGeneratePair, а затем экспортировал ключи в publicKey и privateKey с использованием SecItemCopyMatching (Base64, закодированный перед экспортом, конечно).Теперь у меня проблема с шифрованием данных с использованием открытого ключа.Я использую следующую команду OpenSSL:

openssl rsautl -encrypt -inkey publicKey -pubin -in text.txt -out text.enc

Я получил «не могу загрузить открытый ключ» от OpenSSL.

Я проанализировал publicKey и заметил, что он содержит только следующее содержимое:

SEQUENCE(2 elem)
|  INTEGER(1023 bit)
|  INTEGER 65537

когда открытые ключи, сгенерированные OpenSSL, содержат дополнительную информацию об алгоритме, подобном тому примеру, который был создан OpenSSL:

SEQUENCE(2 elem)
| SEQUENCE(2 elem)
| | OBJECT IDENTIFIER 1.2.840.113549.1.1.1
| | NULL
| BIT STRING(1 elem)
| | SEQUENCE(2 elem)
| | | INTEGER(1024 bit)
| | | INTEGER 65537

Первый вопрос: почему publicKey содержит только 1023 бит для ключа?Для этого открытый ключ OpenSSL имеет длину 1024 бита.

Я попытался создать дополнительную структуру ASN.1 для publicKey, которая была сгенерирована iOS (с использованием редактора HEX и исправлением длины SEQUENCE).Его формат правильный (я проверил, что здесь http://lapo.it/asn1js/),, но я все еще не могу использовать его для OpenSSL. Похоже, что открытый ключ, возвращенный SecItemCopyMatching, потерял байт.

Я проверил содержимоеКроме того, privateKey, поскольку он содержит publicKey внутри. Длина publicKey там также составляет 1023 бита.

Вы можете мне помочь, пожалуйста? Заранее спасибо. Вот пара ключей, которая была сгенерирована на устройстве iOS:

ОткрытыйКлюч:

MIGIAoGAaXp7vlZ5WmCzaL1rrBKXC8rJuc7EpH7Us / 0t4R3hJoDOtRJxywegPY6wm45Oiud7UDh + 9loebAg4dcpUP1le5SkbxrC9Qp8XahmvYVMXUYVGDiLTWID3e3PdE7CwEM5 / lz1c1vRRWjR + 2GzvV4xf5gRwCzZW1tXvXCNWsraqwE8CAwEAAQ ==

PrivateKey: 1032*

1034 * MIICWwIBAAKBgGl6e75WeVpgs2i9a6wSlwvKybnOxKR + 1LP9LeEd4SaAzrUSccsHoD2OsJuOTorne1A4fvZaHmwIOHXKVD9ZXuUpG8awvUKfF2oZr2FTF1GFRg4i01iA93tz3ROwsBDOf5c9XNb0UVo0fths71eMX + YEcAs2VtbV71wjVrK2qsBPAgMBAAECgYBolCowc2hqdUosZPJmbyAXbv5HHXzWY3Hc6v8cHhXnqPpJiXoNhQgZQGpWMOgqzIv0467t7jgPgK8KCosxLBjqvQTVzBkHTsBpBAaJgxzgP04pD8EnJp6uwwx8fZcP3PQOwGkmtWf2KyAcBZD3A + snCxGTRMDOrEPzQe6kBapBwQJBASG9Go92pjIqTRMMam5A5oUt9R1 / iNx0wHowStyf2KHik1GRidaENIYkobZEzjKEbskcq3LGJGna163uu / Y55l8CQF0yLFHBdMi9hYX49s8Abzkd + 3sGI29hFkLrL01ZB2xV / WceNLQH7jxplRClri9Ccr1QFkMGcaXRv2X + eNu6DBECQQEdlTxZzhQwfBtuPB2nwNa2zL6 + rZdj3Lxfc7xGTFQF9MNKcg6P3825rt + qPZWUm45rMpQXVBBOOkO + kAK6xwU3AkBIE8vPFy25K0qfSOOpSQ68QAIFLcQuGgpbiwU0bwycrwyiuevM6O1J7 + aHz3udtWiEHfJ5t / whYM0ElwDl / 0fhAkEAq0EWoY8mQjHAGPMIhIty48fDbJCeFWFPx8lR + gegR1KwcIzcCGrYnHt8ihrfPm9ySjXwWDLYhBx0A5m + IbRZaA ==

1 Ответ

2 голосов
/ 07 августа 2011

OpenSSL требует ключ в формате X.509 (см. RFC 3280):

 SubjectPublicKeyInfo  ::=  SEQUENCE  {
        algorithm            AlgorithmIdentifier,
        subjectPublicKey     BIT STRING  }

   AlgorithmIdentifier  ::=  SEQUENCE  {
        algorithm               OBJECT IDENTIFIER,
        parameters              ANY DEFINED BY algorithm OPTIONAL  }

Строка subjectPublicKey зависит от алгоритма.Для RSA это (RFC 3447):

  RSAPublicKey ::= SEQUENCE {
      modulus           INTEGER,  -- n
      publicExponent    INTEGER   -- e
  }

Не думаю, что проблема в том, что ключ равен 1023, а не 1024 битам.Но вы можете попытаться сгенерировать еще несколько и посмотреть, все ли они имеют длину 1023 бита.

Что говорит OpenSSL, когда вы пытаетесь использовать свое собственное создание (обновленная структура ASN.1)?Можете ли вы опубликовать это здесь?

Кроме того, OpenSSL ожидает это в формате PEM с "----- НАЧАТЬ КЛЮЧ ОТ RSA -----" и "----- ОТКРЫТЬ КЛЮЧ ОТ RSA----- "вокруг данных Base64.

...