Обмен открытыми ключами между iOS и Java

Я хотел бы поделиться открытым ключом, сгенерированным на iPhone/iPad, с сервером на базе Java или устройством Android. На стороне Java (сервер или Android) я хотел бы использовать java.security и libcommonCrypto (материал SecKeyRef) на iOS.

У меня все работает, кроме обмена открытыми ключами между этими двумя платформами. Используя SecItemCopyMatching, я могу экспортировать открытый ключ только в какой-то формат, который не поддерживается ничем другим, кроме Apple. С Java я могу загружать открытые ключи как сертификат X509 (через java.security.X509EncodedKeySpec) или как модуль и экспоненту (через java.security.RSAPublicKeySpec).

Теперь мне нужно знать, как экспортировать сертификат SecKeyRef как X509 или (я думаю, это более простое решение) получить из него модуль и экспоненту. А еще мне нужен путь назад.

Вот пример открытого ключа, загруженного из SecKeyRef и закодированного в BASE64:

MIGJAoGBAMYgXP6rvD/Y8F0VQE0HvxpVnnOxXYl5TDlOfW/leyrCLWGWg9Jp+Tl9dYvK/zWgNpoEfFzMVRpUk9UHcIaDWHW3g0BpS2MVC3Vs/0e2eu6S2WMGHpzqcJB51jJRbnqXQ23nVKC2YE520Po3EvFyTr8MlFJqTCJrovgc7fze4RI5AgMBAAE=

person miho    schedule 27.02.2014    source источник


Ответы (1)


Протокол, который использует Apple libcommonCrypto, описан в RFC3347 и представляет собой модуль и общедоступную экспоненту как ASN. 1 последовательность.

Открытый ключ RSA должен быть представлен с помощью RSAPublicKey типа ASN.1:

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

Цитата из RFC3347, вер. 2.1, А.1.1

person miho    schedule 07.03.2014