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. linux sticky

    文件的粘滞位(sticky)位是作什么用的? 普通文件的sticky位会被linux内核忽略, 目录的sticky位表示这个目录里的文件只能被owner和root删除 粘着位(Sticky bit) ...

  2. goconfig - INI 解析器

    goconfig简介 goconfig是一个由Go语言开发的针对windows下常见的ini格式的配置文件解析器.该解析器在涵盖了所有ini文件操作的基础之上,又针对Go语言实际开发过程中遇到的一些需 ...

  3. Spring基础(3) : 静态工厂和实例工厂创建bean

    public class Factory { public static Person staticCreate(){ Person p = new Person(); p.name="st ...

  4. windows下使用python操作redis(Visual Studio Code)

    1.编辑工具: Visual Studio Code(windows环境) 2.redis服务器:这里用了远程连接,需要配置redis.conf. (1)注释 #bind 127.0.0.1 (2)设 ...

  5. 链接正常但IE浏览器无法显示网页的几种情况

    一.感染病毒木马所致 这种情况往往表现在打开IE时,在IE界面的左下框里提示:正在打开网页,但一直无响应. 右击任务栏/任务管理器/进程,查看.如果CPU占用率100%,可以断定是感染了病毒,这时要查 ...

  6. Core Foundation 官方文档翻译

      Core Foundation框架中常用的隐含类型: 使用这些隐含类型时需要自己初始化,自己去释放内存.所以需要记住,在初始化的同时在相应位置释放.以防出现内存问题.   1.CFStringRe ...

  7. EF数据库优先模式(三)

    今天2018年4月1日,呼叫王伟,81192,收到请返航! 接上次说,本节将LINQ以及lambda表达式 LINQ是C#里面针对SQL Server特有的数据访问操作方法,通俗一点说就是类似于写SQ ...

  8. gradle tool升级到3.0注意事项

    Gradle版本升级 其实当AS升级到3.0之后,Gradle Plugin和Gradle不升级也是可以继续使用的,但很多新的特性如:Java8支持.新的依赖匹配机制.AAPT2等新功能都无法正常使用 ...

  9. 【12】外观模式(Facade Pattern)

    一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化.然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作“ ...

  10. ThinkPHP5微信扫码支付

    1.把微信官网下载的demo放在根目录/vendor/目录下,这里我的是/vendor/wxpay_pc目录 2.把cert里面的文件替换成自己项目的证书(登陆微信商户平台,账户中心,API安全下载) ...