生成RSA KeyPair并从Android中的公钥中提取模数和指数

时间:2016-03-11 08:37:23

标签: android rsa public-key

我在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的模数和指数?

1 个答案:

答案 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;
    }