从文件中读取公钥或私钥时,如何解决“无效的密钥格式”?

Xihar:

我已经创建了公钥和私钥。从php代码生成的公钥和私钥:

<?php
    require __DIR__ . '/vendor/autoload.php';
    use phpseclib\Crypt\RSA;
    $rsa = new RSA();
    extract($rsa->createKey()); 
    $rsa->setPrivateKeyFormat(RSA::PRIVATE_FORMAT_PKCS8);
    $rsa->setPublicKeyFormat(RSA::PUBLIC_FORMAT_PKCS8);

    file_put_contents("privateKey.pem",$privatekey);
    file_put_contents("publicKey.pem", $publickey);

读取这些键的Java源代码:

    import java.io.*;
    import java.security.*;
    import java.security.spec.*;

    public class PublicKeyReader {

    public static PublicKey get(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);
      }

   public static void main (String [] args) throws Exception {
    PublicKeyReader publicKeyReader = new PublicKeyReader();
    PublicKey publicKey = publicKeyReader.get("key/testPub.pem");
    System.out.println(publicKey);
   }
   }

它产生 java.security.InvalidKeyException: invalid key format.

需要帮助。提前致谢。

Maarten Bodewes:

首先,如注释中所述,没有PKCS#8公钥之类的东西。这意味着PHP库不知道它在说什么。相反,如果neubert是正确的,您似乎得到的就是为X.509证书定义的结构,称为X509EncodedKeySpec并且在Java代码中,您确实确实试图使用它来读取公共密钥。

但是,您忘记的是X509EncodedKeySpecASN.1 DER中指定的二进制格式。您收到的是使用ASCII装甲的PEM编码的密钥。换句话说,二进制文件已编码为base64,并且添加了页眉和页脚行。这样做是为了使其与诸如邮件(Privacy Enhanced Mail或PEM)之类的文本界面兼容。

因此,您要做的是卸下装甲。最好使用PEM阅读器(例如Bouncy Castle提供的阅读器)来完成此操作。

PemReader reader = new PemReader(new FileReader("spki.pem"));
PemObject readPemObject = reader.readPemObject();
String type = readPemObject.getType();
byte[] subjectPublicKey = readPemObject.getContent();

System.out.println(type);

X509EncodedKeySpec spec = new X509EncodedKeySpec(subjectPublicKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(spec);
System.out.println(pubKey);

哪个打印

PUBLIC KEY

其次是

Sun RSA public key, 1024 bits
  params: null
  modulus: 119445732379544598056145200053932732877863846799652384989588303737527328743970559883211146487286317168142202446955508902936035124709397221178664495721428029984726868375359168203283442617134197706515425366188396513684446494070223079865755643116690165578452542158755074958452695530623055205290232290667934914919
  public exponent: 65537

对于怀疑论者- 嗨neubert;) -这是X.509规范中SubjectPublicKeyInfo的定义

SubjectPublicKeyInfo  ::=  SEQUENCE  {
     algorithm            AlgorithmIdentifier,
     subjectPublicKey     BIT STRING  }

其中subjectPublicKey包含PKCS#1格式的编码公共密钥-当然,对于RSA公共密钥。

这里是纽伯特的关键的解码版本,所以你可以比较。Java中解析的密钥是相同的密钥。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Dev

InvalidKeyException:从Java中的PEM文件读取EC私钥时,密钥格式无效

来自分类Dev

如何从包含.Net Core中的私钥/公钥的PEM文件中导入PKCS1密钥

来自分类Dev

带有rsa公钥字符串(不是文件)时,加密时出现错误“无效的密钥格式”

来自分类Dev

安装Docker时如何解决ubuntu中的公钥错误

来自分类Dev

如何解码DER / PEM格式的IPFS私钥和公钥?

来自分类Java

如何从我们创建的密钥库中检索我的公钥和私钥

来自分类Dev

从节点js中的存储文件中读取公钥和私钥

来自分类Java

如何在Java中读取rsa公钥文件?

来自分类Dev

分离ECDSA密钥对的公钥和私钥

来自分类Dev

使用Git时如何解决权限被拒绝(公钥)错误?

来自分类Dev

如何从.key文件中提取公钥和私钥?

来自分类Dev

java.security.InvalidKeyException:从PEM文件生成公共私钥时的无效密钥格式

来自分类Dev

如何解决“无效的密钥库异常”?

来自分类Java

JSch:从私钥文件创建公钥

来自分类Dev

如何封送ECC公钥或私钥

来自分类Dev

如何从私钥生成RSA公钥?

来自分类Dev

如何从其私钥生成ECDSA公钥?

来自分类Dev

如何从私钥获取椭圆曲线公钥

来自分类Dev

java:使用从PEM文件读取的RSA公钥解密数据时,如何避免IllegalBlockSizeException?

来自分类Dev

如何在C#中使用公钥加密密码并在私钥中解密私钥

来自分类Dev

IT安全中公钥和私钥的基础

来自分类Dev

在Angular 8中创建组件时,如何解决“检测到无效格式版本-预期:[1]找到:[3]”错误?

来自分类Dev

JSch addIdentity-如何传递私钥和公钥字符串与文件路径

来自分类Java

如何解决无效的AES密钥长度?

来自分类Java

如何在Java中结合私钥和公钥来共享秘密

来自分类Java

如何将私钥和公钥存储到KeyStore中

来自分类Dev

如何从NEAR协议中的私钥和/或帐户ID获取公钥?

来自分类Dev

如何仅在C#中获取RSACryptoServiceProvider公钥和私钥

来自分类Dev

如何以可读的方式读写包含在“ EVP_PKEY”中的公钥和私钥?

TOP 榜单

热门标签

归档