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 错误总结的更多相关文章

  1. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互

    (以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...

  2. 前后端数据加密传输 RSA非对称加密

    任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密.实现方式:公钥加密,私钥解密.研究进度:javascript与java端皆已 ...

  3. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  4. RSA非对称加密Java实现

    原文 加密基础方法类 import java.security.MessageDigest; import sun.misc.BASE64Decoder; import sun.misc.BASE64 ...

  5. 前端js,后台python实现RSA非对称加密

    先熟悉使用 在后台使用RSA实现秘钥生产,加密,解密; # -*- encoding:utf-8 -*- import base64 from Crypto import Random from Cr ...

  6. php RSA非对称加密 的实现

    基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...

  7. ssh rsa 非对称加密 基本原理

    我们常用的ssh 免密登陆是用了 非对称加密的rsa算法(最为常用),与对称加密的相比会慢一些,但是更安全.秘钥长度超过768位无法破解. 默认长度是2048位(无法破解,非常安全) ssh-keyg ...

  8. JSON 接口如何实现 RSA 非对称加密与签名

    代码地址如下:http://www.demodashi.com/demo/14000.html 一.概述 1. 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套公 ...

  9. SSH公钥登录和RSA非对称加密

    SSH登录方式 接触过Linux服务器的同学肯定用过SSH协议登录系统,通常SSH协议都有两种登录方式:密码口令登录和公钥登陆. 一.密码口令(类似于账号密码登录) 1.客户端连接服务器,服务器把公钥 ...

随机推荐

  1. Java NIO系列教程(三) Buffer

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.交互图如下: 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被 ...

  2. PowerBuilder编程新思维5:包装(界面美化与WebUI+React)

    PowerBuilder编程新思维5:包装(界面美化与WebUI+React) 前一节,分析了三种界面美化方案,都是控件级的美化.今天再来分析一下窗口级的美化.上一次讲的DirectUI,大家反响一般 ...

  3. 【learning】多项式开根详解+模板

    概述 多项式开跟是一个非常重要的知识点,许多多项式题目都要用到这一算法. 用快速数论变换,多项式求逆元和倍增法可以在$O(n log n)$的时间复杂度下求出一个$n$次多项式的开根. 前置技能 快速 ...

  4. Winform下判断文件和文件夹是否存在

    //选择文件夹 FolderBrowserDialog dia = new FolderBrowserDialog(); if (dia.ShowDialog() == System.Windows. ...

  5. Mouse点击之后,复制GridView控件的数据行

    本篇是实现用mouse点击GridView控件任意一行,把所点击的数据复制至另一个GridView控件上. 实现大概思路,把所点击的数据行的记录主键找出来,再去过滤数据源. 点击功能,已经实现,可以参 ...

  6. 自动加载的iframe高度自适应

    动态产生iframe,自动加载至body中,还有一个功能就是iframe的高度自适应,下面代码测试于IE和Firefox,Chrome:

  7. c#FTP应用---windows iis

    一.什么是FTP FTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件. 二.搭建前期准备 1.首先打开控制面板找到“程序”点击打 ...

  8. 【CentOS7】CentOS 7 安装 MySQL

    转自:http://www.centoscn.com/mysql/2016/0315/6844.html 环境 CentOS 7.1 (64-bit system) MySQL 5.6.24 Cent ...

  9. Vue:模板&渲染函数学习

    模板&渲染函数区别: 1.代码量:模板代码重复逐行拼写,渲染函数可以迭代拼接方式实现重复代码. 2.函数式组件中应用:基于模板的函数式组件需要手动添加特性和事件,给予渲染函数的函数是组件使用c ...

  10. Android8自定义广播无法收到消息

    在Android 8之前,如果要发送自定义的静态广播,做好其他配置后,只需实例化一个Intent对象intent,然后将其作为参数传入sendBroadcast()方法中即可,例如 Intent in ...