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.客户端连接服务器,服务器把公钥 ...
随机推荐
- php安装扩展模块后,重启不生效的原因及解决办法
在lnmp运维环境中,我们经常会碰到有些php依赖的扩展模块没有安装,这就需要后续添加这些扩展模块.在扩展被安装配置后,往往会发现php-fpm服务重启后,这些扩展并没有真正加载进去!下面就以一个示例 ...
- Spring事务传播属性介绍(三).Nested
Required.Required_New传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Mandatory.Neve ...
- Docker实战-为镜像添加SSH服务
1.基于docker commit命令创建 Docker提供了docker commit命令,支持用户提交自己对定制容器的修改,并生成新的镜像. 命令格式为:docker commit CONTAIN ...
- 无责任Windows Azure SDK .NET开发入门篇(一):开发前准备工作
Windows Azure开发前准备工作 什么是 Azure SDK for .NET?微软官方告诉我们:Azure SDK for .NET 是一套应用程序,其中包括 Visual Studio 工 ...
- [EWS]如何: 通过使用 Exchange 中的 EWS 流有关邮箱事件的通知
摘要 在之前的文章中,介绍ews拉通知的模式订阅邮件.详情可阅读这篇文章:EWS 通过SubscribeToPullNotifications订阅Exchange新邮件提醒 ,可以看到拉通知的模式,是 ...
- [C#]非阻塞监听键盘输入
摘要 最近需要调研监控用户键盘输入的内容,然后收集数据进行用户行为分析.然后就用控制台程序弄了一个demo. 代码如下 class Program { static void Main(string[ ...
- CSS学习笔记03 CSS层叠性、继承性、特殊性
层叠性 所谓层叠性是指多种CSS样式的叠加,也就是说后面设置的样式会层叠(覆盖)之前的样式,层叠性的前提是CSS的选择器的优先级相同,例如,当使用内嵌式CSS样式表定义<p>标记字号大小为 ...
- 3.Decorator Pattern(装饰者模式)
装饰者模式: 动态地将责任附加到对象上.想要扩展功能,装饰者提供有别于继承的另一种选择. 举例: 不知道大家学校的食堂是什么点餐制度(或者大家就直接想成吃火锅,我们要火锅料 + 配菜),我们学校的点餐 ...
- Codeforces343D(SummerTrainingDay06-F dfs序+线段树)
D. Water Tree time limit per test:4 seconds memory limit per test:256 megabytes input:standard input ...
- vue-resource获取不了数据,和ajax的区别,及vue-resource用法
前几天用vue-resource调用接口,用post方式给后端,发现后端php接受不到数据,这好奇怪,最后发现提交给后端的时候 需要加一个参数 就是:emulateJSON : true 这句话的意思 ...