使用公钥 - 私钥加密

时间:2015-09-15 10:26:09

标签: java encryption rsa public-key-encryption

我使用ssh-keygen -t rsa

生成了公钥 - 私钥

以下是我的公钥

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDtbGPZjdnMWk8lJ/CdaBZROCtNk8H+Ru4keC7DK55q2t2ISRgjBaR4qZnWezAA2iJX3cwq2ulfwCPmyoc0G180lUEMDkZkeuWzyvwWjZIo0cehN2j28evgpZadfe+NxYYqQ2f7/3eJ+3IwT4EE6WmzaYjsYXloilJLVJFBbPkdy+1xnHAa1RXsdDNjMPQ9d9PSdr9BYlph21lzflk5wdBxXnLxzUD3mb3j0cCMrIl7IF2CbkKnBC4VFZahRRyJLBWvXvcxXR7Pspv6/WUE2GsZZ3GynAhS7LuHk7NKmB13+lQFejDGO4yVsXQLw7dg+JsIs4h3JkindgJRUytQq7lZ user@Ganesh-VirtualBox

这是我的代码,它为我提供了公钥

public static PublicKey getPublicKey(String filename)
        throws Exception {

    File f = new File(filename);
    FileInputStream fis = new FileInputStream(f);
    DataInputStream dis = new DataInputStream(fis);
    byte[] keyBytes = new byte[(int)f.length()];
    dis.readFully(keyBytes);
    dis.close();

    X509EncodedKeySpec spec =
            new X509EncodedKeySpec(keyBytes);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePublic(spec);
}

我正在将正确的文件名传递给此方法。行kf.generatePublic(spec)正在抛出错误,如下所示。

Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:205)
at java.security.KeyFactory.generatePublic(KeyFactory.java:334)

为什么我收到此错误?

1 个答案:

答案 0 :(得分:1)

通常,X.509格式需要公钥,PKCS#8格式需要私钥。因此,无论何时处理公钥/私钥,都需要确保它们的格式正确。

请阅读以下Oracle docs

  

所以,首先你需要一个关键规范。你可以通过   假设键是根据X.509编码的   标准,例如,如果生成密钥就是这种情况   使用SUN提供商提供的内置DSA密钥对生成器:

您收到的主要错误是InvalidKeyException says

  

这是无效密钥的例外(无效编码,错误   长度,未初始化等)。

现在,在您的情况下,导致此错误的是无效编码,因为您正在使用生成的公共密钥而不使其与X509EncodedKeySpec兼容。因此,解决问题首先按照X.509标准对公钥进行编码,以便您可以在X509EncodedKeySpec 中使用