当前位置: 首页 > 知识库问答 >
问题:

Android中RSA KeyPair的生成及公钥模、指数的提取

祁晟
2023-03-14

我在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();
    }

我如何提取我刚刚生成的公钥的模和指数?

共有1个答案

赵佐
2023-03-14

没有原生的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;
    }
 类似资料:
  • 我搜索了许多网站,试图了解RSA是如何工作的。 我有一个模数“856C2F888474B83612A82E4E00D0CD4069A6783140433D50725F”和指数“03”,我必须解密以十六进制字节组成的信息。我的问题是: 如何创建公钥?一旦我有了公钥,我必须在base64中编码还是公钥准备解密?

  • 如前所述,许多 Git 服务器都使用 SSH 公钥进行认证。 为了向 Git 服务器提供 SSH 公钥,如果某系统用户尚未拥有密钥,必须事先为其生成一份。 这个过程在所有操作系统上都是相似的。 首先,你需要确认自己是否已经拥有密钥。 默认情况下,用户的 SSH 密钥存储在其 ~/.ssh 目录下。 进入该目录并列出其中内容,你便可以快速确认自己是否已拥有密钥: $ cd ~/.ssh $ ls a

  • 我正在Erlang中创建一个应用程序,给定一个RSA私钥,它可以返回RSA公钥和与该priv密钥相关联的x509公钥。 ----只是一个更新---- 在花了一些时间了解x509并阅读了Erlang public_key文档后,我找到了一个解决方案: 如果我可以通过简单地获取模数和publicExponent,从“RSaprivateKey”生成“RSapublicKey”,那么生成这两个键的代码如

  • 问题内容: 我正在尝试了解采取OpenSSH公钥的步骤,如下所示: SSH-RSA AAAAB3NzaC1yc2EAAAABIwAAAQEAqmEmDTNBC6O8HGCdu0MZ9zLCivDsYSttrrmlq87 / YsEBpvwUTiF3UEQuFLaq5Gm + dtgxJewg / UwsZrDFxzpQhCHB6VmqrbKN2hEIkk / HJvCnAmR1ehXv8n2BWw

  • 问题内容: 我正在尝试学习一些加密编码,并生成了当前保存在字节数组中的32字节私有密钥( byte [] privatekey )。我知道公钥是使用 secp256k1 命名为椭圆曲线参数和一个公式生成的,其中,其中G是椭圆曲线上的某个点(ECPoint?),但是我无法将该命名参数的规范和公式转换为的实际编码公钥。我知道自Java 7起,and包中包含一些类,以简短的代码即可完成此操作,但是我找不

  • 我以这种格式将私钥保存在DB中。 我需要从中提取公钥。openssl\u pkey\u get\u详细信息需要资源,但如何从字符串创建资源? 我试过这个 错误是openssl\u pkey\u get\u details()期望参数1是资源,给定布尔值 编辑1: 我试图从@kbarborak bellow获得解决方案,但$pk\u get是错误的: var_转储的输出为: