我有这个奇怪的错误,我无法找到解决方法。
所以我生成一个公钥 - 私钥对,将其转换为字节数组,之后从数组中恢复原始密钥。没有错误
{
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keyPair = kpg.generateKeyPair();
PublicKey pub = keyPair.getPublic();
byte[] pubBytes = pub.getEncoded();
try
{
// to recover the key
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pub_recovered = kf.generatePublic(new X509EncodedKeySpec(pubBytes));
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println("Finish");
之后我重复相同的步骤,但在恢复密钥之前,我将字节数组转换为字符串,之后再转换。在这种情况下,我收到错误。
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keyPair = kpg.generateKeyPair();
PublicKey pub = keyPair.getPublic();
byte[] pubBytes = pub.getEncoded();
try
{
String pub1 = new String(pubBytes, "UTF-8");
byte[] pub2 = pub1.getBytes("UTF-8");
// to recover the key
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pub_recovered = kf.generatePublic(new X509EncodedKeySpec(pub2));
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
错误发生在以下行:
PublicKey pub_recovered = kf.generatePublic(new X509EncodedKeySpec(pub2));
它说:
java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=111, too big.
有谁知道如何修复以及为什么一般会发生这种情况?消息说无效的密钥异常,但是因为它在第一种情况下起作用,我更倾向于在字节转换期间发生了错误。它完全没有意义。
答案 0 :(得分:4)
密钥包含任意字节。这些字节不一定代表有效的UTF8字符。所以你不应该将它们转换为String,因为这是一个有损转换。如果您确实需要String,请使用Hex或Base64编码。
为了让您意识到错误是什么,让我们说您使用ASCII而不是UTF8。 ASCII字符从0到127.所有其他128字节值不表示有效字符。因此,如果密钥包含任何这些值,则转换为String会丢失它们。任何编码基本上都是一样的(IIRC,ISO8859-1除外)。
答案 1 :(得分:0)
之前我遇到过类似的问题,我忘了导入包含项目中密钥的配置文件,我的配置文件是conf / XX.properties