RSA 私钥仅支持 RSAPrivate (Crt) KeySpec 和 PKCS8EncodedKeySpec

2023-11-26

我按照链接中的步骤操作:如何读取.pem文件来获取私钥和​​公钥。我执行了以下三个命令:

1. $openssl genrsa -out mykey.pem 2048
2. $openssl pkcs8 -topk8 -inform PEM -outform PEM -in mykey.pem -out private_key.pem -nocrypt
3. $ openssl rsa -in mykey.pem -pubout -outform DER -out public_key.der

这创建了三个文件,但是当我尝试通过 Java 代码读取这些文件时,我开始遇到以下错误:

PUBLIC KEY EXPO : 65537
Only RSAPrivate(Crt)KeySpec and PKCS8EncodedKeySpec supported for RSA private keys

我的代码供参考:

public class PublicPrivateKeyDemo {
    private static File privateKeyFile = null;
    private static File publicKeyFile = null;

    public static void main(String[] args) {
        String path = "C:/Users/test898/keys";
        privateKeyFile = new File(path + "/" + "private.pem");
        publicKeyFile = new File(path + "/" + "public.der");

        try {
            loadkeys();
        } catch (IOException | GeneralSecurityException e) {
            System.out.println(e.getMessage());
        }
    }

    private static void loadkeys() throws IOException, GeneralSecurityException {
        byte[] publicKeyBytes = new byte[(int) publicKeyFile.length()];
        FileInputStream publicFis = null;
        publicFis = new FileInputStream(publicKeyFile);
        if (publicFis.read(publicKeyBytes) > 0) {
            X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);
            KeyFactory factory = KeyFactory.getInstance("RSA");
            RSAPublicKey pubKey = (RSAPublicKey) factory.generatePublic(publicKeySpec);
            BigInteger pKeyModulus = pubKey.getModulus();
            BigInteger pKeyExponent = pubKey.getPublicExponent();
            System.out.println("PUBLIC KEY EXPO : "+pKeyExponent);

        }

        byte[] privateKeyBytes = new byte[(int) privateKeyFile.length()];
        FileInputStream privateFis = null;
        privateFis = new FileInputStream(privateKeyFile);
        if (privateFis.read(privateKeyBytes) > 0) {
            //PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privateKeyBytes);
            X509EncodedKeySpec spec = new X509EncodedKeySpec(privateKeyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(spec);
            BigInteger pKeyModulus = privKey.getModulus();
            BigInteger pKeyExponent = privKey.getPrivateExponent();
            System.out.println("PRIVATE KEY : "+pKeyExponent);
        } 
    }
}

请帮我看看这里出了什么问题?我认为私钥应该给出类似于下面的值”:

21150549370950609585296765828149303178265715265804890679831411170495636016527926323370428466362501818569080118374307191403222367256185274427528812911191842330928112748042350818573390540259857225467392220170770506599589136056049534085562156615813126185240565396115577449461468695709719589257257375788267753694280485882595576829517086782992300102288858453543505912425724874212273830247789870669315715724390578125469483751830964757980799543436412647956770560679365767737577100276745456138533646455249170660612983618544127693626739283128573829732806886889896396374650462743743148634276240986662548043510018342217214342529

根据链接:http://codeartisan.blogspot.in/2009/05/public-key-cryptography-in-java.html您应该尝试以下操作

生成2048位RSA私钥

$ openssl genrsa -out private_key.pem 2048

将私钥转换为 PKCS#8 格式(以便 Java 可以读取)

$ openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt

以 DER 格式输出公钥部分(以便 Java 可以读取)

$ openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der

你可以阅读下面的java代码:

import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.security.KeyFactory;
    import java.security.NoSuchAlgorithmException;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;

    public class Demo {

        public static final String PRIVATE_KEY="/home/user/private.der";
        public static final String PUBLIC_KEY="/home/user/public.der";

        public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
            //get the private key
            File file = new File(PRIVATE_KEY);
            FileInputStream fis = new FileInputStream(file);
            DataInputStream dis = new DataInputStream(fis);

            byte[] keyBytes = new byte[(int) file.length()];
            dis.readFully(keyBytes);
            dis.close();

            PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory kf = KeyFactory.getInstance("RSA");
            RSAPrivateKey privKey = (RSAPrivateKey) kf.generatePrivate(spec);
            System.out.println("Exponent :" + privKey.getPrivateExponent());
            System.out.println("Modulus" + privKey.getModulus());

            //get the public key
            File file1 = new File(PUBLIC_KEY);
            FileInputStream fis1 = new FileInputStream(file1);
            DataInputStream dis1 = new DataInputStream(fis1);
            byte[] keyBytes1 = new byte[(int) file1.length()];
            dis1.readFully(keyBytes1);
            dis1.close();

            X509EncodedKeySpec spec1 = new X509EncodedKeySpec(keyBytes1);
            KeyFactory kf1 = KeyFactory.getInstance("RSA");
            RSAPublicKey pubKey = (RSAPublicKey) kf1.generatePublic(spec1);

            System.out.println("Exponent :" + pubKey.getPublicExponent());
            System.out.println("Modulus" + pubKey.getModulus());
        }
    }

程序输出:

PUBLIC KEY EXPO : 65537
PRIVATE KEY : 16540425323481903232154296082061217323015064904150073221896716535825697862890781586244035403066600439504989225032100277459509106847714925918656002207273016950425690931486784061794302602299415224979080443644674838230854689682941689891752703570749249869153966528967635783430367525635094847999700308350727275663213969614628360232440655477057807291869565586695953970804798770095849408924111596670565606097668752646013504502815936286143578191877967720393294592625997337105475883689954727277867955887242546330469781268095607005541678733388864537898085207735975487415418212440417692928205650585590564551063589766600954407329
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RSA 私钥仅支持 RSAPrivate (Crt) KeySpec 和 PKCS8EncodedKeySpec 的相关文章

随机推荐

  • Android Visualizer 类抛出运行时异常

    我在演示应用程序中使用 AndroidFX Visualizer 类来读取 FFT 但是当我尝试创建该类的对象时 它会抛出运行时异常 java lang RuntimeException Cannot initialize Visualiz
  • 转换为 int 与下限

    这些之间有什么区别吗 float foo1 int bar 3 0 float foo2 floor bar 3 0 据我了解 这两种情况都有相同的结果 编译后的代码有什么不同吗 转换为 int 将会截断为零 floor 将向负无穷截断 这
  • 在 OpenCV java 中声明 Mat

    如何使用 Java OpenCV 创建和分配 Mat C 版本来自这一页 is Mat C Mat
  • JAVA 用 InetAddress 指定端口

    我正在使用 InetAddress 来确定我的服务器是否在线 如果服务器离线 它将重新启动服务器 此过程每 5 分钟循环一次 以再次检查服务器是否在线 它工作正常 但现在我需要弄清楚如何指定在检查服务器状态时使用端口 43594 而不是默认
  • Netbeans 6.9.1 中的 JAX-RPC 支持

    我正在尝试生成新的 Web 服务客户端 当选择 客户端样式 为 JAX RPC 样式 时 我收到来自 Netbeans 的通知 您必须下载 JAX RPC 支持插件才能创建 JAX RPC 客户端 插件未在可用插件中列出 我搜索了有关此问题
  • ViewModel 使用 Jetpack Compose 触发导航

    在 Android 中 我经常想要导航以响应 ViewModel 的状态更改 例如 成功的身份验证会触发导航到用户的主屏幕 最佳实践是从 ViewModel 内部触发导航吗 是否有有意的机制来触发可组合项中的导航以响应 ViewModel
  • 检测 Paypal 订阅取消

    我编写了一个简单的贝宝订阅系统 用户可以在其中输入他们的信息 单击按钮 然后开始订阅 我想知道如何知道用户何时取消订阅 我已经看到 txn type subscr cancel 但我不知道如何使用它 因为 paypal 不会再次调用我的处理
  • 如何使用cElementTree检索父节点?

    对于 XML
  • 如何在 Emacs 中获取以某个键(组合)开头的命令列表?

    我可以用C h c describe key briefly 并输入一个组合键 它将返回绑定到它的函数 但我也想只输入一个prefix的键组合 并让它列出并描述绑定到以它开头的键序列的所有功能 例如 所有以C x 按组合键 然后按 C h
  • Swing:无法更新 JButton - repaint() 不起作用

    我第一次使用 Swing 来创建一个简单的 GUI 它由一个JFrame我在其上放置了一个JButton单击时 会调用一些其他代码 大约需要花费时间 3秒返回 就在调用此代码之前 在actionPerformed 我想更新按钮上的文本以通知
  • Java 中 fileSystemWatcher 的建议/示例代码

    我正在尝试在 java 中构建一个 fileSystemWatcher 类似于 C 中的 FileSystemWatcher 请建议java是否有任何内置框架功能 或者建议 直接到任何示例 开源项目 查看Apache Commons JCI
  • 获取可用 WiFi 点列表

    我正在创建一个需要互联网连接的应用程序 因此 当 WiFi 设置未启用时 我会弹出一条消息来将其打开 但当它打开时 它不一定连接到 WiFi 接入点 有什么方法可以在列表中显示当前所有可用的 WiFi 点吗 提前致谢 看看下面的方法Wifi
  • Jackson - 如何处理(反序列化)嵌套 JSON?

    vendors vendor id 367 name Kuhn Pollich company id 1 vendor id 374 name Sawayn Hermann company id 1 我有一个 Vendor 对象 可以从单个
  • 为什么此 D3 代码将

    元素添加到正文外部,而不是内部?

    我正在学习 D3 并且在使用选择运算符时遇到了问题 具体来说 为什么下面的代码要添加 p 元素在身体之外 而不是在身体内部 var pData1 d3 select body select p data 1 enter append p 我
  • 如何通过 Spring 将本地 xsd 用于 EhCache

    当我们将 ehcache xml 中的 XSD 文件指向http ehcache org ehcache xsd 一切正常 我们的应用程序可以正确启动 但是我们的服务器无法访问外部网站 因此我们将 XSD 位置更改为本地 如下所示 但应用程
  • Websphere 中的证书链接错误

    我正在尝试从 url 使用 RESTful 服务https someurl com 我在代码中添加了以下属性 Security setProperty ssl SocketFactory provider com ibm jsse2 SSL
  • 无法解析 com.android.support:appcompat-v7:26.1.0 [重复]

    这个问题在这里已经有答案了 升级到 android studio 3 0 gradle 后停止工作 无法解析 app debug compileClasspath 的依赖关系 无法解析com android support appcompa
  • 如何在 Firefox > 108 中设置日期输入日历图标的样式?

    在旧版本的 Firefox 直到 109 中 可以像 Chromium 一样选择日期选择器的图标 input type date webkit calendar picker indicator display none Hides the
  • 如何将对象拆分为嵌套对象? (递归方式)

    我有一个包含下划线 变量名称的数据集 比如下面这样 const data m name my name m address my address p 1 category cat 1 p 1 name name 1 p 2 category
  • RSA 私钥仅支持 RSAPrivate (Crt) KeySpec 和 PKCS8EncodedKeySpec

    我按照链接中的步骤操作 如何读取 pem文件来获取私钥和 公钥 我执行了以下三个命令 1 openssl genrsa out mykey pem 2048 2 openssl pkcs8 topk8 inform PEM outform