繁体   English   中英

与使用Java的KeyPairGenerator等效的openssl是什么?

[英]What is the openssl equivalent of using java's KeyPairGenerator?

首先,我尝试在安全性方面进行询问-我得到了一些支持,但似乎已经有一个星期没有答案了。 我知道这与openssl相关,但是它源于使用java KeyPairGenerator对象,因此我认为它可能对堆栈溢出有效。 请参见下面的代码:

我一直在使用Java的KeyPairGenerator来在程序中生成公钥/私钥,以便我可以加密和解密文件(也可以使用Java加密/解密方法)。 我希望能够转到使用openssl来生成这些公共专用密钥对,但是如果我使用命令行生成的openssl密钥,则在解密文件时会不断出现填充异常。 例如,我尝试不使用java的KeyPairGenerator,而是尝试使用openssl生成密钥:

openssl rsa -in keypair.pem -outform DEF -pubout -out public.der
openssl pkcs8 -topk8 -nocrypt -in keypair.pem -outform DER -out private.der

我尝试使用DER文件加密/解密文件的地方。 最终,我尝试过的每种密钥格式似乎都给我带来了问题。

我假设这意味着我的openssl命令中的键格式与java的KeyPairGenerator的工作方式不匹配。 这是我的密钥生成代码的片段:

public void createPublicPrivateKeys() throws IOException, NoSuchAlgorithmException {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    logger.info("Password to encrypt the private key: ");
    String password = in.readLine();
    logger.info("Generating an RSA keypair.");

    // Create an RSA key key pair
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    keyPairGenerator.initialize(4096);
    KeyPair keyPair = keyPairGenerator.genKeyPair();

    logger.info("Done generating the keypair.\n");

    // Write public key out to a file
    String publicKeyFilename = "publicKey.der";
    logger.info("Public key filename: " + publicKeyFilename);

    // Get  encoded form of the public key for future usage -- this is X.509 by default.
     byte[] publicKeyBytes = keyPair.getPublic().getEncoded();

     // Write the encoded public key
     FileOutputStream fos = new FileOutputStream(publicKeyFilename);
     fos.write(publicKeyBytes);
     fos.close();

     String privateKeyFilename = "privateKey.der";
     logger.info("Private key filename: " + privateKeyFilename);

     // Get the encoded form -- PKCS#8 by default.
     byte[] privateKeyBytes = keyPair.getPrivate().getEncoded();

     // Encrypt the password
     byte[] encryptedPrivateKeyBytes = new byte[0];
     try {
         encryptedPrivateKeyBytes = passwordEncrypt(password.toCharArray(), privateKeyBytes);
     } catch (Exception e) {
         e.printStackTrace();
     }

     fos = new FileOutputStream(privateKeyFilename);
     fos.write(encryptedPrivateKeyBytes);
     fos.close();
 }

使用Java的标准KeyPairGenerator的openssl等效命令行语句是什么? 还要注意,不能选择使用外包装,例如充气城堡。

OpenSSL命令行rsapkcs8不会生成密钥对。 它们仅从一种形式转换为另一种形式和/或显示。 对于RSA(仅), genrsa生成OpenSSL的“旧式”私钥格式的密钥对,该密钥对与Java不(轻松)兼容。 您的rsapkcs8命令确实会将旧格式转换为Java首选的“ X.509”(SPKI)和PKCS#8 DER格式。 从1.0.0开始的OpenSSL还具有genpkey ,该genpkey会为所有受支持的非对称算法(包括RSA)生成密钥或在适用的情况下生成参数,并且默认为PKCS#8输出。

您的Java代码具有passwordEncrypt步骤,该步骤不是标准Java,也没有说明。 如果您的passwordEncrypt做到,OpenSSL库根据该标准支持基于密码的PKCS#8加密,但是大多数OpenSSL命令行功能不支持。 如果您试图在Java中使用示例的private.der ,并且试图对其进行任何基于密码的(或其他)解密,那将是行不通的,因为未加密; 它甚至不在用于加密密钥的PKCS#8结构中。 但是, 您甚至尝试解密任何数据或更可能是有效密钥之前 ,都会发生该错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM