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