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. Haproxy 重定向跳转设置 - 运维小结

    前面已经详细介绍了Haproxy基础知识 , 今天这里再赘述下Haproxy的重定向跳转的设置.  haproxy利用acl来实现haproxy动静分离,然而在许多运维应用环境中,可能需要将访问的站点 ...

  2. Golang 方法method

    方法method Go中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型的结合 只能为同一个包中的类型定义方法 receiver可以是类型的值或者指针 不存在方法重 ...

  3. myeclipse解决Fail to create the java Virtual Machine

    今天在打开myeclipse的时候,就显示出 Fail to create the java Virtual Machine 这样的一个窗口出来. 解决的方案就是在myeclipse的安装目录下找到m ...

  4. HDU 1535 Invitation Cards(逆向思维+邻接表+优先队列的Dijkstra算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1535 Problem Description In the age of television, n ...

  5. UIKit 框架之UIActionSheet

    UIAlertView和UIActionSheet相似,区别很小, 很容易理解. // // ViewController.m // UIActionSheet // // Created by Ci ...

  6. Spring学习之路-从放弃到入门

    AOP:方法拦截器 IOC:类管理容器 主要讲讲这一天看Spring视频学到的东西,以下的叫法全是自创的. 1.类实例管理容器 关于Spring,首先是对类的管理,在常规情况,生成一个类需要调用new ...

  7. [转]C# Bootstrap table之 分页

    本文转自:https://www.cnblogs.com/zhangjd/p/7895453.html 效果如图: 一.声明talbe <div class="container&qu ...

  8. MVC会员注销功能Cookie的应用

    我们实现了<MVC应用程序实现会员登录功能>http://www.cnblogs.com/insus/p/3466512.html 有登录就会有注销功能.此次Insus.NET练习一个MV ...

  9. 【Linux】ZeroMQ 在 centos下的安装

    转自:http://www.cnblogs.com/mjorcen/p/4479642.html 一.ZeroMQ介绍 ZeroMQ是一个开源的消息队列系统,按照官方的定义,它是一个消息通信库,帮助开 ...

  10. Proud Merchants(01背包变形)hdu3466

    I - Proud Merchants Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...