我有以下代码来读取PKCS#8格式的私钥

public void encryptHash(String hashToEncrypt, String pathOfKey, String Algorithm) {

FileInputStream fis = null;

byte[] encodedKey = null;

try {

File f = new File(pathOfKey);

encodedKey = new byte[(int)f.length()];

fis = new FileInputStream(f);

fis.read(encodedKey);

fis.close();

KeyFactory kf = KeyFactory.getInstance("RSA");

PrivateKey privateKey = kf.generatePrivate(new PKCS8EncodedKeySpec(encodedKey));

Signature rsaSigner = Signature.getInstance("SHA1withRSA");

rsaSigner.initSign(privateKey);

fis = new FileInputStream(hashToEncrypt);

BufferedInputStream bis = new BufferedInputStream(fis);

byte[] buffer = new byte[1024];

int len = 0;

while ((len = bis.read(buffer)) >= 0) {

try {

rsaSigner.update(buffer, 0, len);

} catch (SignatureException ex) {

Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex);

}

}

bis.close();

byte[] signature = rsaSigner.sign();

System.out.println(new String(signature));

} catch (SignatureException ex) {

Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex);

} catch (InvalidKeyException ex) {

Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex);

} catch (InvalidKeySpecException ex) {

Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex);

} catch (FileNotFoundException ex) {

Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex);

} catch (IOException ex) {

Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex);

} catch (NoSuchAlgorithmException ex) {

Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex);

} finally {

try {

fis.close();

} catch (IOException ex) {

Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

但我得到以下例外.

dic 09, 2011 1:59:59 PM firmaelectronica.DataEncryptor encryptHash

Grave: null

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DER input, Integer tag error

at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)

at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)

at firmaelectronica.DataEncryptor.encryptHash(DataEncryptor.java:40)

at firmaelectronica.FirmaElectronica.main(FirmaElectronica.java:39)

Caused by: java.security.InvalidKeyException: IOException : DER input, Integer tag error

at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:361)

at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:367)

at sun.security.rsa.RSAPrivateCrtKeyImpl.(RSAPrivateCrtKeyImpl.java:91)

at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75)

at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:316)

at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:213)

... 3 more

知道什么是错的吗?我试过OpenSSL openssl pkcs8 -inform DER -in aaa010101aaa_FIEL.key -out aaa010101aaa_FIEL_key.pem并且它可以工作但是当我想读取DER格式的密钥时它只发送该异常.

解决方法:

首先,我必须取消保护密钥,如下所示

openssl pkcs8 -inform DER -in myderPassProtectedPrivate.key -outform PEM -out myPEMPrivate.key

它告诉我我的密码,然后我有文件myPEMPrivate.key一旦完成这个继续摆脱密码保护密钥如下

openssl pkcs8 -topk8 -nocrypt -in myPEMPrivate.key -outform DER -out myNotAnyMoreProtectedPrivate.key

有了这个,我现在能够使用上面的代码加载密钥.如果我们想在java中使用传递保护密钥,则建议使用密钥库.

附:我试图避免使用openssl pkcs8 -topk8 -nocrypt -inform der -in myderPassProtectedPrivate.key -outform der -out myDERNoPassProtectedPrivate.key来摆脱保护密钥的密码的两个步骤,但我不知道为什么我有错误解密密码时出错我使用的是WinOpenSSL,这也就是我收到错误的原因.

标签:java,rsa,private-key

来源: https://codeday.me/bug/20190521/1146988.html

java der格式_读取DER格式java中的私钥相关推荐

  1. java testng 源代码_根据测试用例的java源码自动生成TestNG的XML文件

    1.读取当前项目目录下的所有.java文件,过滤出含有@Test标识的java源文件 2.读取java文件内容,解析出包名.类名.方法名.使用Vector存储,第一个元素为包名,第二个元素为类名,从第 ...

  2. java 解析日期格式_日期/时间格式/解析,Java 8样式

    java 解析日期格式 自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期 ...

  3. scanner java重新输入_如何使用Scanner Java重复读取用户输入

    我正在尝试为我的程序创建一个简单的菜单来读取用户输入.这是代码: public void menu() { String command; System.out.println("To op ...

  4. java 异常信息_优雅的异常处理 -- Java中的异常

    处理异常自己处理 try-catch抛出让别人处理 throws 获得异常信息 直接打印异常对象 通过异常对象调用getMessage()方法获得 通过异常对象调用printStackTrace()方 ...

  5. java future用法_纯干货:Java学习过程中的21个知识点和技术点

    我们在Java学习过程中要学会抓重点,善于总结,Java学习过程中常见的21个知识点和技术点你知道吗?下面和千锋广州小编一起来看看吧! 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识 ...

  6. java 7 反射_【7】java 反射详解

    [7]java 反射详解 获取Class对象的方式: 1. Class.forName("全类名"); 将字节码加载进内存,返回Class对象,多用于配置文件,将类名定义在配置文件 ...

  7. java 序列化 文件_一种恢复Java序列化文件数据的方法与流程

    本发明涉及信息安全技术领域,特别涉及一种恢复Java序列化文件数据的方法. 背景技术: 在数据解析恢复领域经常会遇到序列化文件的解析.Java序列化是Java 自身提供的一种数据序列化方式,它允许开发 ...

  8. java jai例子_用JAI扩展Java的图像处理能力

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Java的图像处理能力不断地在增长,但是将一个如PNG或者JPEG格式的文件写入磁盘或从磁盘读取这样的操作仍然是一种巫术.解决方案是使用Java Adva ...

  9. java jai例子_用JAI扩展Java的图像处理能力(转)

    Java的图像处理能力不断地在增长,但是将一个如PNG或者JPEG格式的文件写入磁盘或从磁盘读取这样的操作仍然是一种巫术.解决方案是使用Java Advanced Imaging(JAI)API.JA ...

  10. java定义接口_一文知道Java中接口的定义

    使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: 方法:接口中的方法只有定义而没有被实现. ...

最新文章

  1. 098~100:ORM迁移
  2. IT兄弟连 JavaWeb教程 EL表达式获取对象的属性以及数组的元素
  3. 探讨磷酸铁锂电池在UPS的应用
  4. 计算机检索规则,搜索引擎的语法规则
  5. 利用WinRAR命令行压缩文件或文件夹
  6. C++:19---重载与模板、模板特例化
  7. python矩阵运算dot_numpy中的dot矩阵乘法
  8. Python3利用pymysql操作 MySQL
  9. gdb+zbacktrace找到cpu过高php代码
  10. 蓝桥杯2015年第六届C/C++B组省赛第八题-移动距离
  11. WampServer 不能打开phpmyadmin 的解决办法
  12. C语言如何制作dIL文件,C语言学习笔记———指针
  13. 关于软考的一些事,你知道吗?
  14. windows 匿名管道: 父进程与子进程通信 (进程间通信之CreatePipe)
  15. Springboot+netty实现Web聊天室
  16. Qt与Mysql进行连接实现账号的注册登录和密码修改和验证码
  17. ccf-csp 201809-2 买菜
  18. 逻辑智力测试-----让你怀疑人生!!
  19. android面试题(深度解析)
  20. 研发组织该如何设计绩效体系?

热门文章

  1. Cloudera Manager 基本介绍(CDH版本)
  2. unity 视频录制总结
  3. 服务器ldb文件可以删除,Access数据库锁死,出现.ldb文件解决办法
  4. Day4 数据分析 Excel图表【零基础】
  5. 三维图像专业处理软件Dragonfly的中文语言包
  6. 读书有感gt; 职场小说
  7. 构造非支配解集(Python)
  8. Django新增数据
  9. html 播放amr ios,关于iOS设备以amr格式播放音频文件
  10. 【Kay】MySQL必会常用函数