我在我的应用中创建了一个公钥/私钥对,并对公钥进行了编码(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)之间可能存在实现问题。
任何想法在这里发生了什么以及如何解决这里的问题?
任何提示都会非常受欢迎!
鲁迪