RSA 非对称加密,私钥转码为pkcs8 错误总结
RSA 非对称加密,私钥转码为pkcs8 错误总结
最近在和某上市公司对接金融方面的业务时,关于RSA对接过程中遇到了一个坑,特来分享下解决方案。
该上市公司简称为A公司,我们简称为B公司。A-B两家公司通信采用HTTPS协议,加密方式选择RSA非对称加密+签名的方式,以保障数据通信安全,不被篡改。
虽然对于数据通信来说,安全是有了保障。但对于开发来说,却添了不少的麻烦。麻烦就在于加解密十分繁琐。
A 公司提供了自己的公钥,以及我们公司(B)的私钥。我们需要将私钥转换成pkcs8 的格式。然后从私钥中,释放出公钥。
但是在转换我们公司(B)的私钥格式的时候却出了问题。
私钥格式如下:
该私钥为行文方便,已做修改,非正确私钥。将该私钥保存为test.pem
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAIwanpQ5GCOLCjqpx18PJTm2reqMwvmuk8L9XpV/ed04jbrPHJlVAsOgmOxCnEvHQ9ZBfipqUlKu3Wxrx2UYh2OSENrhOKflLawFYP/4uCIr88BoP/OXIl7PnkmxqJbKzsOyp9oZpkpBU1jhWAkAvouAojTWFeJk0b/J0bu3k0C1AgMBAAECgYEAitcuY5EY/NAi+PObIfbuWv1P6GpKJgj9YXSZMOm9KJ+MxJ3Op5z5OkiCg0+Xd/kmnsMUdpAauNmVkIZWeTcPovrhBTQ3/2F6ToBTiv474QEHoBc5TtIKc2xHUmD/h6YpCuPXChC4ctKLAgHImIwB+Az0FUzfclGMbKGPoei/2YECQQDq0XB4lX6ajWq+2UyzA5WgZe6vPZ/YXSF1HRd1Z1uHa8qoPG7KYAlk6ZNpj1LyPOUL0p628WOoItICK0oqTMOxAkEAmL38BwDx1VZAvqyM4XKdWV+J8LlVeWgbPytz92ywxoaD55MvDKInHhdO3abhwqBA7eaGvLrwRVkn66ksX3UiRQJBAK+4aXUjUimwGCiXjmkMDqWIghRLhlmwX8A3M/3ciccOaAp7puD0+zK0BGdjJMw3u6OcSr9WZqBE5mlPIeIDrhECQECz6jlFSyxmN1MOYTd3h/Q+Jn7U48JkOXaO/7cGUfQnM2U70ih14EA8+2mlsejyXc7pYpY8Ul/uHp0TsvpU8kkCQQCfxgnHibKQxH94TKK+CMWiehMqc3oSyeUYLlJazHguZirwUlotLyfDXv8Wams7ZezihHtu53NB2gLmuZ
执行转码pkcs8命令
openssl pkcs8 -topk8 -inform PEM -in test.pem -outform PEM -nocrypt -out rsa_private_key.pem
然后报错:
unable to load Private Key
139656125785928:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: ANY PRIVATE KEY
在网上查看资料,发现是没有加声明头和声明尾
-----BEGIN PRIVATE KEY-----
这里放置私钥
-----END PRIVATE KEY-----
但是执行完毕之后,发现还是报上面提示的错误,百思不得其解。无聊的时候,查看A公司提供的私钥,和正常私钥的区别。这一比较就比较出了问题。下面是正常私钥的格式。
正常私钥:
roverliang$ cat private_key.pem
-----BEGIN RSA PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ4WOVPo5DrVv/ew
iEJMQWYRPBsRkyXG1CXb3PtWKjUbPbLDRSeHhGeuSU4nLGDCBHRv52lLM508CfX8
dDOXhlX3G/FGc/lKjAVhOhoV3+yZWaHJmdhpzwvmADOKho9GXO5JJlSLVlS2mp/g
2OjoV9x5Xktjs30D1NaqKkK4MUppAgMBAAECgYEAkaRz6GRVcAbhNvbCciIC1l/m
eiG06UbGyKJIcp2tgQO50emo2oQ1bbfZ/VCFyBa3N/aowg7wXFml66RMAgQFU9bj
8mrbEuJ6ZmtvTkIFVWqpWSQKgewYphcy1VYyn4Z3DMGCCQ346lL3QpLWV0dNEhL3
QcR69qt5ZzshUmrzO+kCQQDO7c2HAq8qkx/L5z6Ggtz3YtbWzTafyuFUv8q5/v/Q
btcEAL1RjshF0/qsjbhpwHqFRLLGkptSg7BjUsgrW6cTAkEAw5NTKgDUgICJouay
nQbBQujTwvuNLi21ZIQi3i6vAoHu1eVCfpGSnUnsvYmEKtNHZO++o4lBhbIuoI6L
gBUMEwJAYMALIp78q5lSepHKSDYTfo92B8S3T4saQ/fQn5o8nYXVfoeh/OoXdZ6h
S+CPYtKd9oWiWPnfKXttE2N3N96IhQJAaZM0B66fCCdbJVcIAIBO/4GUHuOQWOdP
zk0OTYZB70aY2VqDRLPsw3/OjpqXgE7BcZmB/eHwPu3rAb0xTRkPhQJASGO0f1xw
5emsQQavF1PBXUDhB9FJN1L5aobB7x8bTZUwsd+3Wd36eS5t6ZoopjUpdROyelUc
KHENKgdw==
-----END RSA PRIVATE KEY-----
roverliang$
正确私钥与错误私钥对比图如下:

由此我们得知,错误私钥没有换行,而正确私钥是每行的长度为64个字符。于是我做了一个大胆的假设,使用脚本,强制将私钥换行,重新整理格式。PHP脚本如下:
处理脚本:
//新建一个脚本,命名为trans.php
<?php
$str = "您的错误私钥放在这";
$dataArr = str_split($str, 64);
echo "-----BEGIN RSA PRIVATE KEY-----".PHP_EOL;
foreach ($dataArr as $trunk) {
echo $trunk.PHP_EOL;
}
echo "-----END RSA PRIVATE KEY-----".PHP_EOL;
//执行下命令
/usr/local/bin/php ./trans.php > test.pem
执行正常的pkcs8转换命令
openssl pkcs8 -topk8 -inform PEM -in test.pem -outform PEM -nocrypt -out rsa_private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
然后你会发现,所有的问题都迎刃而解。快乐的写代码吧
RSA 非对称加密,私钥转码为pkcs8 错误总结的更多相关文章
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
(以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...
- 前后端数据加密传输 RSA非对称加密
任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密.实现方式:公钥加密,私钥解密.研究进度:javascript与java端皆已 ...
- Atitit RSA非对称加密原理与解决方案
Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制 3 1.4. 基于rsa的授权验证机器码 4 1.5. ...
- RSA非对称加密Java实现
原文 加密基础方法类 import java.security.MessageDigest; import sun.misc.BASE64Decoder; import sun.misc.BASE64 ...
- 前端js,后台python实现RSA非对称加密
先熟悉使用 在后台使用RSA实现秘钥生产,加密,解密; # -*- encoding:utf-8 -*- import base64 from Crypto import Random from Cr ...
- php RSA非对称加密 的实现
基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...
- ssh rsa 非对称加密 基本原理
我们常用的ssh 免密登陆是用了 非对称加密的rsa算法(最为常用),与对称加密的相比会慢一些,但是更安全.秘钥长度超过768位无法破解. 默认长度是2048位(无法破解,非常安全) ssh-keyg ...
- JSON 接口如何实现 RSA 非对称加密与签名
代码地址如下:http://www.demodashi.com/demo/14000.html 一.概述 1. 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套公 ...
- SSH公钥登录和RSA非对称加密
SSH登录方式 接触过Linux服务器的同学肯定用过SSH协议登录系统,通常SSH协议都有两种登录方式:密码口令登录和公钥登陆. 一.密码口令(类似于账号密码登录) 1.客户端连接服务器,服务器把公钥 ...
随机推荐
- Python制作回合制手游外挂简单教程(上)
引入: 每次玩回合制游戏的时候,反反复复的日常任务让人不胜其烦 玩问道的时候,我们希望能够自动刷道,玩梦幻希望能自动做师门.捉鬼等等 说明: 该外挂只能模拟鼠标键盘操作,并不能修改游戏数据 我这里使用 ...
- Java SDK夯住(Hang)问题排查
夯住(Hang)是指程序仍在运行,卡在某个方法调用上,没有返回也没有异常抛出:卡住时间从几秒到几小时不等. Java程序发生Hang时,应该首先使用 jstack 把java进程的堆栈信息保存下来 , ...
- 并发编程之 CountDown 源码分析
前言 Doug Lea 大神在 JUC 包中为我们准备了大量的多线程工具,其中包括 CountDownLatch ,名为倒计时门栓,好像不太好理解.不过,今天的文章之后,我们就彻底理解了. 如何使用? ...
- 关于winform文本框怎么实现html的placeholder效果
winfrom默认是不支持这种操作的,此时需要重写控件操作,具体代码如下: public class TextBoxEx : TextBox { public String PlaceHolderSt ...
- SQLite事务 SQLite插入多条语句为什么这么慢?.net (C#)
今天有个朋友测试 SQLite,然后得出的结论是:SQLite 效率太低,批量插入1000条记录,居然耗时 2 分钟!下面是他发给我的测试代码.我晕~~~~~~ using System.Data; ...
- Direct2D教程I——简介及首个例子
在博客园里,系统的Direct2D的教程比较少,只有“万一”写了一个关于Direct2D的系列(Delphi 2009).于是,仿照其系列,写一个在VS下的Direct2D系列教程. 博客园中的高手还 ...
- [javaSE] 看博客学习多线程的创建方式和优劣比较和PHP多线程
通过实现Runnable接口创建线程 获取Thread对象,new出来,构造函数参数:Runnable对象 Runnable是一个接口,定义一个类MyRunnable实现Runnable接口,实现ru ...
- 撩课-Web大前端每天5道面试题-Day36
1.介绍一下你对浏览器内核的理解? 主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎. 渲染引擎:负责取得网页的内容(HTML.XML.图像等等) ...
- Codeforces833A
A. The Meaningless Game time limit per test:1 second memory limit per test:256 megabytes input:stand ...
- MySQL中使用连接查询
连接查询: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接): 最终结果是: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)! 连接查询的意义: 在用户查看数据的时候 ...