我在Android中生成了一个公钥私钥对。现在我需要将我的公钥发送回服务器以与RSA加密进行通信。但是,我正在与.NET服务器通信(在C#中)。因此,我需要以下列格式发送我的公钥:
<RSAKeyValue><Modulus>Modulus In Base 64</Modulus><Exponent>Exponent in Base 64</Exponent></RSAKeyValue>
我使用以下代码生成密钥对:
public static void generateKey() {
try
{
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
final KeyPair key = keyGen.generateKeyPair();
privateKey = key.getPrivate();
publicKey = key.getPublic();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
如何提取刚刚生成的PublicKey的模数和指数?
答案 0 :(得分:0)
没有原生Android方法可以解决我的问题。为了提取生成的公钥的模数和指数,我使用了以下代码,它将Android公钥作为输入并以.NET XML格式返回:
public static String getPublicKeyAsXml(PublicKey publicKey) throws Exception
{
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPublicKeySpec ks = kf.getKeySpec(publicKey, RSAPublicKeySpec.class);
BigInteger modulus = ks.getModulus();
BigInteger exponent = ks.getPublicExponent();
byte[] modByte = modulus.toByteArray();
byte[] expByte = exponent.toByteArray();
modByte = testBytes(modByte);
expByte = testBytes(expByte);
String encodedModulus = Base64.encodeToString(modByte, Base64.NO_WRAP);
String encodedExponent = Base64.encodeToString(expByte, Base64.NO_WRAP);
String publicKeyAsXML = "<RSAKeyValue>" +
"<Modulus>" + encodedModulus + "</Modulus>" +
"<Exponent>" + encodedExponent + "</Exponent>" +
"</RSAKeyValue>";
return publicKeyAsXML;
}