RSA公钥生成Android和普通Java之间的互操作性

时间:2016-05-21 09:13:30

标签: java android rsa

我在我的应用中创建了一个公钥/私钥对,并对公钥进行了编码(Base 64)。然后我将编码的字符串导入数据库表(mysql)。

在servlet中,我读取编码的字符串并对其进行解码以返回原始字节序列。

我已经验证公钥的原始字节序列在我的应用程序和我的servlet中是相同的 - 至少前10个字节和后10个字节。我假设字节数组的内部部分(长度为294字节)应该是相同的。

然后我尝试使用以下方法基于该字节数组创建有效的RSAPublicKey:

    public static RSAPublicKey createPublicKey(byte [] publicKeyData)

{
    KeyFactory keyFactory;
    RSAPublicKey newKey = null;

    try
    {
        keyFactory = KeyFactory.getInstance("RSA");

        X509EncodedKeySpec KeySpec = new X509EncodedKeySpec(publicKeyData);
      newKey = (RSAPublicKey) keyFactory.generatePublic(KeySpec);
    }
    catch (NoSuchAlgorithmException e)
    {
        e.printStackTrace();
    }
    catch (InvalidKeySpecException e)
    {
        e.printStackTrace();
    }
    return newKey;
}

这是我在Android方面的代码:

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
  kpGenerator.initialize(spec);
  KeyPair kp = kpGenerator.generateKeyPair();
  PrivateKey privateKey = kp.getPrivate();
  PublicKey publicKey = kp.getPublic();
  KeyFactory keyFactory = KeyFactory.getInstance("RSA");

  byte[] res = publicKey.getEncoded();
  String pubKeyString;

  pubKeyString = Base64.encodeToString(res, Base64.NO_WRAP);
  System.out.println("Public Key (Base64):" + pubKeyString

然而,当我比较计算出的RSAPublicKey的模数值和我的应用程序中创建的模数值时,我会得到不同的值。

我已经尝试从我的Android App中的字节数组创建第二个RSAPublicKey - 我发现它与原始数组相同 - 所以我假设从字节数组创建公钥的方法应该没问题。

我怀疑Android(似乎基于SSL)和servlet(基于Java 8)之间可能存在实现问题。

任何想法在这里发生了什么以及如何解决这里的问题?

任何提示都会非常受欢迎!

鲁迪

0 个答案:

没有答案
相关问题