samodum
@samodum
Какой вопрос - такой и ответ

Как экспортировать RSA private key из Java в виде XML?

Привет всем!
Выручайте, уже замучался. В гугле меня забанили - не найду никак ответа.
В общем, вопрос такой. В Java (Android) я генерирую пару приватный-публичный ключи. В Андроиде всё проходит отлично - шифрует и дешифрует строки как надо. Но теперь мне надо экспортировать эту пару в .NET (C#). Публичный экспортируется как надо в виде
<RSAKeyValue><Modulus>AKfPOw...OZASeVM0qkuWp3</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

Но вот с экспортом приватного ключа проблемы. RSAPrivateKeySpec даёт возможность получить только модуль и приватную экспоненту. Но для .NET нужны ещё параметры P, Q, DP, DQ, InverseQ (D - это приватная экспонента). Откуда их взять? Вычислять по формулам из википедии? Но ведь должно быть уже готовое решение. Только вот найти его никак не могу. Помогите.
Код:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.genKeyPair();
PublicKey publicKey = kp.getPublic();
PrivateKey privateKey = kp.getPrivate();

String xmlPublic = getPublicKeyAsXml(publicKey);
String xmlPrivate = getPrivateKeyAsXml(privateKey);

public String getPrivateKeyAsXml(PrivateKey privateKey) throws Exception {
	KeyFactory kf = KeyFactory.getInstance("RSA");
	RSAPrivateKeySpec ks = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class);
	BigInteger modulus = ks.getModulus();
	BigInteger exponent = ks.getPrivateExponent();

	byte[] modByte = modulus.toByteArray();
	byte[] expByte = exponent.toByteArray();

	String encodedModulus = Base64.encodeToString(modByte, Base64.NO_WRAP);
	String encodedExponent = Base64.encodeToString(expByte, Base64.NO_WRAP);

	String publicKeyAsXML = "<RSAKeyValue>" +
			"<Modulus>" + encodedModulus + "</Modulus>" +
			"<Exponent>AQAB</Exponent>" +
			"<P></P>" +
			"<Q></Q>" +
			"<DP></DP>" +
			"<DQ></DQ>" +
			"<InverseQ></InverseQ>" +
			"<D>" + encodedExponent + "</D>" +
			"</RSAKeyValue>";

	Log.d(TAG, "getPrivateKeyAsXml: " + publicKeyAsXML);
	return publicKeyAsXML;
}
  • Вопрос задан
  • 906 просмотров
Решения вопроса 1
samodum
@samodum Автор вопроса
Какой вопрос - такой и ответ
Забыл написать, что я решил проблему
public String getPrivateKeyAsXml(PublicKey publicKey, PrivateKey privateKey) throws Exception
    {
        KeyFactory kf = KeyFactory.getInstance("RSA");
        RSAPublicKeySpec ksPublic = kf.getKeySpec(publicKey, RSAPublicKeySpec.class);
        RSAPrivateKeySpec ksPrivate = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class);

        BigInteger n = ksPublic.getModulus();
        BigInteger e = ksPublic.getPublicExponent();
        BigInteger d = ksPrivate.getPrivateExponent();

        BigInteger p = findFactor(e, d, n);
        BigInteger q = n.divide(p);
        if (p.compareTo(q) > 1) {
            BigInteger t = p;
            p = q;
            q = t;
        }

        BigInteger dp = d.mod(p.subtract(BigInteger.ONE));
        BigInteger dq = d.mod(q.subtract(BigInteger.ONE));
        BigInteger inverseQ = q.modInverse(p);

        String publicKeyAsXML = "<RSAKeyValue>" +
                "<Modulus>" + convertToString(n) + "</Modulus>" +
                "<Exponent>" + convertToString(e) + "</Exponent>" +
                "<P>" + convertToString(p) + "</P>" +
                "<Q>" + convertToString(q) + "</Q>" +
                "<DP>" + convertToString(dp) + "</DP>" +
                "<DQ>" + convertToString(dq) + "</DQ>" +
                "<InverseQ>" + convertToString(inverseQ) + "</InverseQ>" +
                "<D>" + convertToString(d) + "</D>" +
                "</RSAKeyValue>";

        Log.d(TAG, "getPrivateKeyAsXml: " + publicKeyAsXML);
        return publicKeyAsXML;
    }

    private String convertToString(BigInteger n) {
        return Base64.encodeToString(n.toByteArray(), Base64.NO_WRAP);
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@SZolotov
Asp.net core, MAUI,WPF,Qt, Avalonia
Если на стороне java можно сделать ключ в виде pem, передавайте в таком виде.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы