[英]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命令行rsa
或pkcs8
不会生成密钥对。 它们仅从一种形式转换为另一种形式和/或显示。 对于RSA(仅), genrsa
生成OpenSSL的“旧式”私钥格式的密钥对,该密钥对与Java不(轻松)兼容。 您的rsa
和pkcs8
命令确实会将旧格式转换为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.