Ключ Java RSA для ключа XML C#: изменить RSA PublicKey и PrivateKey в Java на XML-строку C# XML RSAKeyValue?

RSACryptoServiceProvider в C# принимает ключи в следующем формате:

Для открытых ключей:

<RSAKeyValue>
    <Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus>
    <Exponent>AQAB</Exponent>
</RSAKeyValue>

Для приватных ключей:

<RSAKeyValue>
    <Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus>
    <Exponent>AQAB</Exponent>
    <P>/aULPE6jd5IkwtWXmReyMUhmI/nfwfkQSyl7tsg2PKdpcxk4mpPZUdEQhHQLvE84w2DhTyYkPHCtq/mMKE3MHw==</P>
    <Q>3WV46X9Arg2l9cxb67KVlNVXyCqc/w+LWt/tbhLJvV2xCF/0rWKPsBJ9MC6cquaqNPxWWEav8RAVbmmGrJt51Q==</Q>
    <DP>8TuZFgBMpBoQcGUoS2goB4st6aVq1FcG0hVgHhUI0GMAfYFNPmbDV3cY2IBt8Oj/uYJYhyhlaj5YTqmGTYbATQ==</DP>
    <DQ>FIoVbZQgrAUYIHWVEYi/187zFd7eMct/Yi7kGBImJStMATrluDAspGkStCWe4zwDDmdam1XzfKnBUzz3AYxrAQ==</DQ>
    <InverseQ>QPU3Tmt8nznSgYZ+5jUo9E0SfjiTu435ihANiHqqjasaUNvOHKumqzuBZ8NRtkUhS6dsOEb8A2ODvy7KswUxyA==</InverseQ>
    <D>cgoRoAUpSVfHMdYXW9nA3dfX75dIamZnwPtFHq80ttagbIe4ToYYCcyUz5NElhiNQSESgS5uCgNWqWXt5PnPu4XmCXx6utco1UVH8HGLahzbAnSy6Cj3iUIQ7Gj+9gQ7PkC434HTtHazmxVgIR5l56ZjoQ8yGNCPZnsdYEmhJWk=</D>
</RSAKeyValue>

Я создаю свою пару ключей на Java следующим образом:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.genKeyPair();
PublicKey publicKey = kp.getPublic();
PrivateKey privateKey = kp.getPrivate();

Редактировать:

Я хочу знать, как преобразовать ключи, созданные на Java, в XML-ключи C#? Такие вопросы, как Перенос XML-ключей .Net RSA на Java, делают то, что я хочу, в обратном направлении. Он считывает ключи из C# и генерирует их для использования внутри Java. Мне нужно преобразовать ключи Java в ключи XML C#.

Я не уверен, поэтому я не голосую за закрытие, но может ли это быть дубликатом stackoverflow.com/questions/5527423/…?

Camilo Terevinto 30.04.2018 13:26

@CamiloTerevinto Вопрос, который вы связали, - получить ключи на C# и преобразовать их в ключи на Java. Я хочу сделать это в обратном направлении. Создавайте ключи на Java и используйте их внутри C#.

VSB 30.04.2018 14:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
963
1

Ответы 1

Из RSAPublicKey (документация по API 5.24) есть методы в классе Java RSAPublicKey

java.math.BigInteger    getModulus()        Returns the modulus of the public key.
java.math.BigInteger    getPublicExponent() Returns the public exponent of the public key.

Таким образом, оттуда вы сможете объединить правильно сформированную строку Xml.

Это также может быть полезно Как сгенерировать ключи RSA на Java _ Блог разработчиков программного обеспечения Novixys

Этот также довольно близко показывает, что ключи Xml передаются между двумя компонентами кода C#, хотя он немного отличается в том, что это Elliptic Curve, а не RSA. Ключевой метод там - FromXmlString

Проще говоря, вы вызываете методы объекта Java для извлечения модуля и экспоненты, вы строите строку, сохраняете ее в файл, а затем в C# загружаете из файла в строку и переходите в FromXmlString.

Я хочу знать, как преобразовать эти значения в значение ключа XML в C#?

VSB 30.04.2018 14:25

Есть одна важная небольшая морщинка, которую нужно включить. BigInteger.toByteArray() почти делает именно то, что нужно. Однако примерно в половине случаев он возвращает массив байтов с начальным нулем, поскольку если старший байт BigInteger будет> = 128, тогда начальный нулевой байт будет добавлен. Это кодирование с дополнением до двух, которое учитывает отрицательные числа. Однако соответствующий Стандарты XML не распознает отрицательные числа, поэтому этот нулевой байт должен быть удален, если он присутствует до кодирования массива base64.

President James K. Polk 30.04.2018 17:16

@JamesKPolk: спасибо, я обычно не пишу код на Java, я видел этот вопрос в очереди C#. Ваше здоровье.

S Meaden 30.04.2018 17:22

Спасибо за ваше обновление. Я все это знал. Но все же преобразование объекта PublicKey в ключ XML для C# кажется сложным. Ключ XML имеет параметры типа InverseQ, которые необходимо вычислить. Даже мы знаем modulus и exponent, но их представление и преобразование из массива байтов в строку и base64 требуют особого внимания. Я искал для этого фрагмент кода.

VSB 30.04.2018 21:47

вы уверены, что вам нужно что-нибудь кроме модуля и экспоненты? Я бы провел эксперимент, чтобы использовать несколько элементов данных, насколько это возможно. Вы можете быть удивлены.

S Meaden 30.04.2018 21:50

@JamesKPolk Начальный ноль в массиве байтов при преобразовании в base64 вызовет ошибку? Я имею в виду, вы говорите, что ведущие нули при преобразовании в базу 64 не удаляются и у нас будет строка с префиксом нулей?

VSB 30.04.2018 21:52

Вызвать ошибку? Нет, он будет работать без ошибок, но это будет неправильный формат.

President James K. Polk 30.04.2018 22:40

Другие вопросы по теме