Привет всем!
Выручайте, уже замучался. В гугле меня забанили - не найду никак ответа.
В общем, вопрос такой. В 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;
}