Здравствуйте.
Решил создать собственную тему, т.к. мой вопрос отличается от существующих тем по эфемерным ключам.
В существующем android-приложении необходимо применить гибридное шифрование, чтобы передать зашифрованное сообщение получателю. Получатель может использовать как андроид, так и iOs, десктоп. Для этого нужно создавать сессионные ключи шифрования с использованием эфемерных ключей.
Алгоритм, как я его понимаю: вырабатываем секретный ключ, который используем в симметричном шифровании текста, сам выработанный секретный ключ шифруем с помощью ассиметричного алгоритма на основе пары сгенерированных ключей, для которых устанавливаем параметры такие же, как публичный ключ получателя. После формирования пары ключей нам необходимо создать ключ согласования, в котором будут участвовать закрытая часть эфемерного ключа и открытая часть сертификата получателя. И используя данный ключ согласования мы шифруем секретный симметричный ключ. Далее это все запаковываем в транспортный ключ и передаем получателю вместе с зашифрованным сообщением. Далее получатель, получив зашифрованное сообщение и зашифрованный сессионный ключ, с помощью своего закрытого ключа и публичной части эфемерного ключа, которую он получает вместе с транспортным ключом, формирует ключ согласования. На этом ключе согласования он расшифровывает секретный ключ шифрования, который используется для дешифрования сообщения.
В примерах к sdk для андроид подсказали смотреть на PKCS7EnvEphTransport. В общем то более менее понятно, что происходит: сперва генерируется секретный ключ, далее им шифруется сообщение, потом сам секретный ключ шифруется парой сгенерированных ключей, для пары ключей устанавливаются такие же параметры, что и у открытого ключа получателя. Для передачи зашифрованного ключа 2й стороне используется некий стандартный транспортный контейнер, в который записываются данные как самого зашифрованного ключа, так и открытая часть эфемерной пары, а также IV и параметры открытого ключа получателя. На принимающей стороне происходит все наоборот: выделяется зашифрованное сообщение, транспортный контейнер для сессионного ключа, из транспортного контейнера достается зашифрованный ключ, имитовставка, публичная часть эфемерного ключа, формируется ключ согласования из закрытого ключа получателя и открытой части эфемерного ключа и на этом ключе согласования расшифровывается симметричный секретный ключ.
Мне необходимо формировать данный сессионный ключ таким образом, чтобы его можно было корректно дешифровать на всех платформах. Есть ли механизмы, позволяющие на разных платформах использовать один и тот же формат транспортного ключа, при условии, что везде используется CryptoPro? Есть ли в iOs, десктопе аналог GostR3410_KeyTransport из примера PKCS7EnvEphTransport, заполнив который я бы смог получить нужные данные (iv, публичная часть эфемерного ключа, сам сессионный ключ) для дешифровки сессионого ключа? Или нужно самому формировать транспортный ключ в виде последовательности байт, обговорив на каждой платформе границы всех необходимых компонентов (что то типа массива байт, в котором сперва указывается размер iv, потом сам iv, затем размер публичной части эфемерного ключа, потом сама публичная часть, затем размер сессионного ключа, затем сам сессионный ключ, размер имитовставки, сама имитовставка) и на каждой платформе использовать только те компоненты, которые ей необходимы для работы?