首先,我试图在安全性方面提出这个问题——我得到了一些支持,但似乎已经有一个星期没有答案了。我知道这是与 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 等效命令行语句是什么?另请注意,不能选择使用诸如充气城堡之类的外部包。