当前位置: 首页 > 知识库问答 >
问题:

如何在JAVA中生成RSA密钥对(以openssl格式)

茹高义
2023-03-14

如何使用OpenSSL支持的格式在Java中生成RSA密钥对?

有没有办法像我们在php中那样直接生成它们?

输出应该如下所示:

    -----BEGIN PUBLIC KEY-----
   MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3Qa9WiabsxGv2uJBNNFn
   Ai3vEDF7Evr85RlgrviUSzkSupEH29PaazKX04/4M7mEQswVZOHSzkFRXiviImi1
   c1UrWlZENctS3A6P3RSqOonzrw6CVDJ4Nn/iydWlHhFaHBPpCopS537iHvJIey7K
   -----END PUBLIC KEY-----

   -----BEGIN PRIVATE KEY-----
   MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDdBr1aJpuzEa/a
   4kE00WcCLe8QMXsS+vzlGWCu+JRLORK6kQfb09prMpfTj/gzuYRCzBVk4dLOQVFe
   K+IiaLVzVStaVkQ1y1LcDo/dFKo6ifOvDoJUMng2f+LJ1aUeEVocE+kKilLnfuIe
   8kh7LsplosEQSxpfhjQcxt6qgRQk+eI9kyxczLvt2S0goAoO7rPIhi1LQFI1uUij
   U18a+vsu9uv/mMAa/R101EZxIJyZZDtjyajPUP3Zo7LfxXZpVgg8xXAE6xY3PGlJ

   -----END PRIVATE KEY-----

非常感谢。

共有1个答案

糜野
2023-03-14

你说的是OpenSSL支持的格式,但是OpenSSL支持(RSA和其他)私钥的多种格式,根据你的计数方式,有十几种。

可能巧合的是,您展示的特定格式是Java crypto直接支持的两种格式的PEM格式,即PKCS8 unencrypted for private和'X.509'(really SubjectPublicKeyInfo又名SPKI),因此可以简单地创建:

//nopackage
import java.security.*;
import java.util.Base64;

public class SO43459993SimpleRSAPEM {
    public static void main (String[] args) throws Exception {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(2048); KeyPair kp = kpg.generateKeyPair();

        System.out.println ("-----BEGIN PRIVATE KEY-----");
        System.out.println (Base64.getMimeEncoder().encodeToString( kp.getPrivate().getEncoded()));
        System.out.println ("-----END PRIVATE KEY-----");
        System.out.println ("-----BEGIN PUBLIC KEY-----");
        System.out.println (Base64.getMimeEncoder().encodeToString( kp.getPublic().getEncoded()));
        System.out.println ("-----END PUBLIC KEY-----");

    }
}

示例输出:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCiaT/zBxjS6ZBiCbUBiUFirm3/
xo+A8LY3yBsffu6/6mO0ZwrXNtrHmpQEdld5/XM+k8vKOE+KTfeUwikKOLnHeuzV5qrO4/WZPDyz
ggXGqFrgI3/WT8AqTcAmc21CG92Wx+omVaFyl5j5/Sh6aapYl6TG7qX4NXzEln7Ka70Az39nKtqi
oe7LA5ARjcyOBRPXVg2Oq/O+XSwy/epFHIs83ucswF1j/4Nv4u7juCIQ4+sQFyBUwh2docgH9+Ls
MQ18a2N3khNbhxD9TkehuSGU+/KHd0OmEXVHx6dxEvvVTG+MYuuqBbUxdnReggTdX5bJUXtzf+RM
+6yuqauLNlJDAgMBAAECggEAES0WYUpn2q5u4Z9rMC1m59vQsFM8jANpEf8stykCcPOF9edL4zTe
8GstqkcluzYNwRl6XPmVl+fk/iuGkZksNKeQcpLBj73WFI2lUcq3d6oIaln2xCCNDyxH3QkqDerK
hY7A+armtyrHN/EJHeEc7d+jwpIspVJqzpOn9xpr07DyPJ7EK2IsoupMrJ3OwAmcTWvCnv0465fr
t+OOzlHF6m1fQtTKD7kBcKE9vnGdkNbpOxY6VI0p9e0R3ymITeXWFxebq8G7hMO3baD775t55smv
fbWPl41idvTfwAIgUdfKaEk/28zlXwm6WBt3MBF+jlhbfe3zr5RphxtVdIzIYQKBgQD2iqtSXM6/
PrxM2CNnS0RwVNvDcx6+BwemJk+pkfq1BSuXrLbAs3KPfZ51ASHmV9+8IDuV98nJEEKu4einIGUa
m4GK7gHAq0Ml2ISyXTB+28ZXkgDWqvP044T1RbakBrccDDcbsSiIRznyXkJ2VrTA6+Xufz4rIs2Y
IkYnwBKPkwKBgQCopFGz/7VqPDRd5RL0pm2YWp85M06SD8zss0lbL+EBnAGy/zRjKYMMVlZpuA+Q
6od8idyYoOBNpFgf+SGJTs097yUP7Vk98wk4jDqC0Kbd9VGXlUfWwpFeGlcO6zVTtVC6ShLDyBTL
QoulgIhFmHtjHLsUKhehixhbtDXXfmEAkQKBgDvrR+gkljr0zF8AyNn5+RA0D5VZDUex/bHr7cCQ
shX8w7OBTolXE6i8Jx7Yv5x0DvRyAQlZx7kOMqa+UQUNYoUs9jcF0Xc6KH+yN84ByB+M2o+99GY3
9kK2aUITR2hmGWq/rUUVsXwtk2/MaOrJ9/RLYP6t/jYNp1oqOlK+48PxAoGBAJhTM+leA0Nd9f8J
tsF8wmlnEYLdMQ8FbpguqQfQi3CktXQ0x+D50gEGyy7arlS7Qn3fGH5UccYvt9nJcd1QbFqQ8+0a
+gzWxXFqWD9osBC0UWqV0DnPrPZO3GwBUD23/J8H4UMuKnoeNXzcSDp0rJ6tiN2B1652sR3D/Q4U
fRHBAoGAAseKaXqnBWeSS2RE/FZ7meSC0Wge7dTgkTKRRkJfKuOfLvTs1FB6mNVGkffcjltPuxM3
m79c3lnkD9ub7UZcJtNRY8sv0oM6K6ez1stB9M7qc/ZbgbAE7LzCqgGIywgNVCBAZ4zgSGl0h1SM
/evMdsYTYUXubxolHGq56o+UL4M=
-----END PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAomk/8wcY0umQYgm1AYlBYq5t/8aPgPC2
N8gbH37uv+pjtGcK1zbax5qUBHZXef1zPpPLyjhPik33lMIpCji5x3rs1eaqzuP1mTw8s4IFxqha
4CN/1k/AKk3AJnNtQhvdlsfqJlWhcpeY+f0oemmqWJekxu6l+DV8xJZ+ymu9AM9/ZyraoqHuywOQ
EY3MjgUT11YNjqvzvl0sMv3qRRyLPN7nLMBdY/+Db+Lu47giEOPrEBcgVMIdnaHIB/fi7DENfGtj
d5ITW4cQ/U5HobkhlPvyh3dDphF1R8encRL71UxvjGLrqgW1MXZ0XoIE3V+WyVF7c3/kTPusrqmr
izZSQwIDAQAB
-----END PUBLIC KEY-----
 类似资料:
  • 问题内容: 背景 在Linux上使用以下命令在OpenSSL上生成RSA密钥, 创建了以下内容: Java下的以下代码6, 输出以下内容: 问题 如何在通过Java代码创建的私钥和公钥周围放置“盔甲”? 为什么通过Java代码生成的每一行密钥都比OpenSSL输出的密钥长? 有什么区别吗?其他团队正在使用的一种工具在使用上述Java代码生成的私钥对消息签名时失败。但是,该工具使用OpenSSL生成

  • 我知道可以使用此链接为OpenSSL中的自签名证书生成一个公钥和一个私钥。但是对于给定的公钥,我有没有可能算出对应的私钥呢?我一直在使用1024位的RSA公钥。

  • 问题内容: 我使用openssl生成认证密钥。这是我的命令: openssl genrsa -des3 -out enc_key.pem 1024 我导出到cer文件中,然后使用java keytool导入到Java keystore(jks)中。 密钥库听起来不错。我可以从Java应用程序加载密钥库。 问题是客户端连接到服务器(在这种情况下是FTP服务器,而不是Web服务器,而我使用apache

  • 我们在大型机中使用ICSF创建了一个RSA密钥对。十六进制格式生成的公钥大小为580个字符,结构分为 前缀-18字符(9字节)-3082010A02820100 公模-512 char(256 bytes)AA5DA28FEDADE7FEAD8C610E4C16E54FD415FEA173518BD9ADC3C7EB332E86E973B7F6E9BF90F277FD4B6A15E736C5668

  • 在许多情况下,安全软件涉及(桌面)应用程序和web界面之间的交互。对于(RSA)非对称加密,我们使用OpenSSL的C库(目前版本为1.0.2d)和OpenSSL PHP库。 所有标准的东西: 私有加密(C)数据和公共解密(PHP) 公共加密(C)数据和私有解密(PHP) 作品还有另一种方法:PHP- 此外,使用PHP生成加密的私钥,并使用C/C解密该密钥也可以。但不是相反:我想用PHP解密一个用

  • 主要的问题是,我对C相当陌生,OpenSSL留档对我来说不够清晰,我尝试过使用读和写rsa键到C中的pem文件,但我不太明白。例如,函数如何创建私有和公共?而从何而来?pcszPassphrase的意义是什么? 我会解释,好像这是某种伪代码,这就是我想做的,粗体部分是我不知道如何做的: 生成私钥和公钥作为十六进制缓冲区(客户端) 基本上,我知道如何处理AES加密/解密和通信协议,反正他们已经实现了