从文件加载公钥数据

2024-03-04

在我的应用程序中,我生成一个公钥/私钥对并将它们存储在磁盘上以供以后使用。加载并重新初始化私钥工作正常,但对于私钥,我得到一个未知的 KeySpec 类型:java.security.spec.PKCS8EncodedKeySpec - 我不知道为什么。

这就是我创建和保存密钥的方式(代码稍微简化以更易于阅读):

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(4096);
KeyPair keyPair = kpg.generateKeyPair();
privKey =keyPair.getPrivate();
pubKey =keyPair.getPublic();        

DataOutputStream out=new DataOutputStream(ctx.openFileOutput(PRIVKEY_FILE,Context.MODE_PRIVATE));
byte[] data=privKey.getEncoded();
out.write(data);
out.close();

DataOutputStream out=new DataOutputStream(ctx.openFileOutput(PUBKEY_FILE,Context.MODE_PRIVATE));
byte[] data=pubKey.getEncoded();
out.write(data);
out.close();

接下来加载私钥工作正常:

DataInputStream in=new DataInputStream(ctx.openFileInput(PRIVKEY_FILE));
byte[] data=new byte[in.available()];
in.readFully(data);

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data);
KeyFactory kf = KeyFactory.getInstance("RSA");
privKey = kf.generatePrivate(keySpec);

decryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
decryptCipher.init(Cipher.DECRYPT_MODE, privKey);

公钥的类似代码惨遭失败:

DataInputStream in=new DataInputStream(ctx.openFileInput(PUBKEY_FILE));
byte[] data=new byte[in.available()];
in.readFully(data);

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data);
KeyFactory kf = KeyFactory.getInstance("RSA");
pubKey = kf.generatePublic(keySpec); --> here the exception is thrown

encryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, pubKey);             

那么我做错了什么?从磁盘加载公钥数据的正确方法是什么?

Thanks!


公钥和私钥的编码方式不同。虽然私钥是用 PKCS #8 编码的,但公钥却不是。相反,它们根据 ASN.1 规范以 X.509 进行编码。

Key.getFormat() 方法的描述:

返回此键的主要编码格式的名称,如果此键不支持编码,则返回 null。如果存在该密钥的 ASN.1 规范,则主要编码格式根据适当的 ASN.1 数据格式命名。例如,ASN.1 公钥数据格式的名称是SubjectPublicKeyInfo,由 X.509 标准定义;在这种情况下,返回的格式是“X.509”。同样,私钥的 ASN.1 数据格式的名称是 PrivateKeyInfo,由 PKCS #8 标准定义;在本例中,返回的格式为“PKCS#8”。

据此,您不应将公钥读取为 PKCS #8,而应将其读取为 X.509。

考虑更改您的公钥读取代码:

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data);

to:

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

从文件加载公钥数据 的相关文章

随机推荐

  • Git - 冲突(重命名/删除)是什么意思?

    我在理解其他问题中的含义方面没有取得多大成功 这是一个 Ruby on Rails 项目 如果您知道该怎么做 这可能非常简单 我尝试合并两个分支 这是结果的 部分 CONFLICT rename delete db migrate 2016
  • 如何找到预告片字典?

    浏览 PDF 规范 它说trailer之前的startxref 对我来说 这意味着xref可以出现在文档中的任何位置 但是trailer仍然出现在startxref 在您必须解析它之前 这是有意义的 因为您必须反向解析 您无法考虑注释或字符
  • 行分隔的 json 序列化和反序列化

    我正在使用 JSON NET 和 C 5 我需要将对象列表序列化 反序列化为行分隔的 json http en wikipedia org wiki Line Delimited JSON http en wikipedia org wik
  • Java中如何通过代理发送HTTPS请求?

    我正在尝试使用 HttpsUrlConnection 类向服务器发送请求 服务器存在证书问题 因此我设置了一个信任所有内容的 TrustManager 以及一个同样宽松的主机名验证器 当我直接发出请求时 这个管理器工作得很好 但当我通过代理
  • fputcsv 不会在 CSV 文件中写入任何数据

    在我的网站中 我从 mysql 数据创建一个表 然后现在我想在表底部添加一个导出按钮 以便用户能够将数据下载为 CSV 文件 为此 我编写了虚拟表单
  • preg 匹配重复或增量字符

    我使用 preg match 来验证密码 preg match 5 password 它也接受特殊字符 但由于某种原因 我需要修改它应该接受 仅限字母数字 至少 5 个字符长 非常重要的是它不能有任何重复或 增量字符 例如 aaaa 或 1
  • 对各个页面的不同图像使用 Backstretch

    我希望有人可以提供帮助 我正在尝试使用 jQuery Backstretch 为 Bootstrap Wordpress 中的每个特定页面应用不同的背景图像 例如 主页 bg 图像 a 关于 bg 图像 b 新闻 bg 图像 c 等等 我已
  • 在自定义验证器指令中注入 ngControl 会导致循环依赖

    我正在尝试创建自定义 Angular 2 验证器指令 它像这样注入 NgControl Directive selector ngModel customValidator providers provide NG VALIDATORS u
  • 有关 CUDA 中统一虚拟寻址 (UVA) 的信息/示例

    我试图理解 CUDA 中统一虚拟寻址 UVA 的概念 我有两个问题 是否有任何示例 伪 代码可以演示这个概念 我在 CUDA C 编程指南中读到 UVA 只能在 64 位操作系统上使用 为什么会这样呢 A 统一虚拟地址空间 http doc
  • 如何使用 Hibernate Context 会话创建通用 DAO 类

    我正在尝试使用 Hibernates Context Sessions 实现通用 DAO 以下是我的镜头 import java io Serializable public interface GenericDao
  • 在批处理文件中登录并注册系统

    所以 我非常努力地尝试在批处理文件中制作登录和注册系统 我注册成功 只是将用户名和密码回显到 dll 文件或 txt 文件 但我不知道如何登录 我尝试了很多代码 但我不明白在互联网上找到的登录 注册代码 例如 我尝试过的 echo off
  • 如何使Java应用程序独立?

    我必须将 Java 应用程序刻录到 CD 上 此应用程序必须在之前未进行任何安装的情况下在每台 Windows PC 上运行 也不应安装 JRE 我想您也可以将 JRE 从程序文件夹复制到 CD 上 然后 添加批处理脚本以使用 本地 JRE
  • 词法或预处理器问题:找不到“MyViewController.h”文件

    当我尝试更改视图控制器名称时 h and m 我收到此错误 Lexical or PreProcessor Issue MyViewController h file not found 仅供参考 尽管存在词法错误 但应用程序仍可以正确运行
  • Spring 3.1实例化bean时出错

    我有以下课程 public abstract class AbstractBusinessModule public class MS3BusinessModule extends AbstractBusinessModule public
  • 在 Woocommerce 中添加运送区域的州而不是邮政编码

    我有一个 woocommerce 网站 默认情况下 在 woocommerce 中 我可以通过邮政编码限制运输区域 但是 如何在送货区域中添加我所在国家 地区的州 以便客户可以通过结账页面中的 下拉菜单 选择他们居住的州 而不是输入邮政编码
  • Heroku 给出 500 错误,信息很少 + 内部服务器错误

    Heroku 在页面上显示此消息 internal server error 此错误显示在控制台中 GET 500内部服务器错误 检查 Heroku 应用程序的日志以查看更多详细信息 您可以使用流式传输日志Heroku CLI https
  • 远程 logcat - Android Studio

    是否可以看到远程设备上的应用程序的logcat 简而言之 是否可以远程logcat 我向客户端发送了一个应用程序 这在您的设备中给出了错误 我使用同一版本的模拟器进行了测试 但仅发生了该错误 是否可以查看远程应用程序的 logcat 设备
  • Brushes.White 减慢了图形演示速度

    下面是 Conway 的生命游戏在 WPF 中的 非常幼稚的 实现 这只是一个演示 xaml
  • 这种方法名称/局部变量混合会发生什么?

    我在一些代码中发现了一个执行以下操作的方法 def method1 method1 1 2 2 3 4 5 5 return method1 uniq end ruby 如何处理这个问题 我知道这是错误的代码 但是 ruby 如何知道如何处
  • 从文件加载公钥数据

    在我的应用程序中 我生成一个公钥 私钥对并将它们存储在磁盘上以供以后使用 加载并重新初始化私钥工作正常 但对于私钥 我得到一个未知的 KeySpec 类型 java security spec PKCS8EncodedKeySpec 我不知