【问题标题】:Encryption using public-private keys使用公钥-私钥加密
【发布时间】:2015-09-15 10:26:09
【问题描述】:

我已经使用 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)

为什么会出现这个错误?

【问题讨论】:

  • SSH 密钥未在 X509 中编码。请参阅stackoverflow.com/questions/12749858/rsa-public-key-format 的答案。
  • OpenSSH 的最新版本应该能够以“X.509”(实际上是 SPKI)PEM 格式输出公钥,其名称为 ssh-keygen -e -m PKCS8。 Java 无法在此处处理 PEM,因此要么(1)删除标志行并将 base64 转换为二进制 DER,要么(2)使用openssl rsa -pubin -in pemfile -out derfile -outform der。或者,OpenSSH 默认使用与 OpenSSL 兼容的 PEM 格式作为 private 密钥,因此给定私钥 id_rsa 只需执行 openssl rsa -in id_rsa -pubout -out publicderfile -outform der。在 OpenSSL 1.0.0+ 中,您可以使用 pkey 而不是 rsa

标签: java encryption rsa public-key-encryption


【解决方案1】:

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

Oracle docs阅读以下内容

因此,首先您需要一个密钥规范。您可以通过以下方式获得 下面,假设 键是根据 X.509 编码的 标准,例如,如果生成了密钥 使用 SUN 提供商提供的内置 DSA 密钥对生成器:

您得到的主要错误是InvalidKeyException 其中says

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

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

中使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 2013-05-07
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2022-01-15
    相关资源
    最近更新 更多