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




Из 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#?
Есть одна важная небольшая морщинка, которую нужно включить. BigInteger.toByteArray() почти делает именно то, что нужно. Однако примерно в половине случаев он возвращает массив байтов с начальным нулем, поскольку если старший байт BigInteger будет> = 128, тогда начальный нулевой байт будет добавлен. Это кодирование с дополнением до двух, которое учитывает отрицательные числа. Однако соответствующий Стандарты XML не распознает отрицательные числа, поэтому этот нулевой байт должен быть удален, если он присутствует до кодирования массива base64.
@JamesKPolk: спасибо, я обычно не пишу код на Java, я видел этот вопрос в очереди C#. Ваше здоровье.
Спасибо за ваше обновление. Я все это знал. Но все же преобразование объекта PublicKey в ключ XML для C# кажется сложным. Ключ XML имеет параметры типа InverseQ, которые необходимо вычислить. Даже мы знаем modulus и exponent, но их представление и преобразование из массива байтов в строку и base64 требуют особого внимания. Я искал для этого фрагмент кода.
вы уверены, что вам нужно что-нибудь кроме модуля и экспоненты? Я бы провел эксперимент, чтобы использовать несколько элементов данных, насколько это возможно. Вы можете быть удивлены.
@JamesKPolk Начальный ноль в массиве байтов при преобразовании в base64 вызовет ошибку? Я имею в виду, вы говорите, что ведущие нули при преобразовании в базу 64 не удаляются и у нас будет строка с префиксом нулей?
Вызвать ошибку? Нет, он будет работать без ошибок, но это будет неправильный формат.
Я не уверен, поэтому я не голосую за закрытие, но может ли это быть дубликатом stackoverflow.com/questions/5527423/…?