Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android和普通Java之间的RSA公钥生成互操作性_Java_Android_Rsa - Fatal编程技术网

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

Android和普通Java之间的RSA公钥生成互操作性,java,android,rsa,Java,Android,Rsa,我在我的应用程序中创建了一个公钥/私钥对,并对公钥进行了编码(Base 64)。然后,我将编码的字符串导入数据库表(mysql) 在servlet中,我读取编码字符串并对其进行解码,以返回原始字节序列 我已经验证了公钥的原始字节序列在我的应用程序和servlet中是相同的——至少前10个字节和后10个字节是相同的。我假设字节数组的内部部分(长度为294字节)应该是相同的 然后,我尝试使用以下方法基于该字节数组创建有效的RSAPublicKey: public static RSAPubl

我在我的应用程序中创建了一个公钥/私钥对,并对公钥进行了编码(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应用程序中从字节数组创建第二个RSAPublicKey,我发现它与原来的完全相同,所以我假设从字节数组创建公钥的方法应该是可以的

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

你知道这里发生了什么吗?我如何解决这里的问题

欢迎任何提示


Rudi

您必须验证所有294字节。如果您正确编码公钥,它们应该完全可互操作。请在Android端显示公钥编码的代码。另外,你有没有在Java端对关键数据进行base64解码?我在最初的帖子中添加了Android代码。是的,我确实在Java端解码了关键数据。最后我可以比较这些文件——它们真的不同,前34个字节是相同的,最后一个字节也是相同的-所以现在我必须找出为什么会有差异…最后我有一点时间来跟踪这个问题-这确实是由于某种类型的打字错误-在数据库中有一个错误的值,我比较了编码的公钥。关键是相同的-至少第一个和最后一个字节-但在中间部分有差异。不知道为什么-我本以为密钥会完全不同-我真的必须比较EJP提到的所有密钥@谢谢你指出这个问题。你必须验证所有的294字节。如果你正确地编码了公钥,它们应该是完全可互操作的。请在Android端显示公钥编码的代码。另外,你有没有在Java端对关键数据进行base64解码?我在最初的帖子中添加了Android代码。是的,我确实在Java端解码了关键数据。最后我可以比较这些文件——它们真的不同,前34个字节是相同的,最后一个字节也是相同的-所以现在我必须找出为什么会有差异…最后我有一点时间来跟踪这个问题-这确实是由于某种类型的打字错误-在数据库中有一个错误的值,我比较了编码的公钥。关键是相同的-至少第一个和最后一个字节-但在中间部分有差异。不知道为什么-我本以为密钥会完全不同-我真的必须比较EJP提到的所有密钥@EJB:感谢您指出这个问题。