RSA 非對稱加密,私鑰轉碼爲pkcs8 錯誤總結

RSA 非對稱加密,私鑰轉碼爲pkcs8 錯誤總結

最近在和某上市公司對接金融方面的業務時,關於RSA對接過程當中遇到了一個坑,特來分享下解決方案。php

該上市公司簡稱爲A公司,咱們簡稱爲B公司。A-B兩家公司通訊採用HTTPS協議,加密方式選擇RSA非對稱加密+簽名的方式,以保障數據通訊安全,不被篡改。安全

雖然對於數據通訊來講,安全是有了保障。但對於開發來講,卻添了很多的麻煩。麻煩就在於加解密十分繁瑣。oop

A 公司提供了本身的公鑰,以及咱們公司(B)的私鑰。咱們須要將私鑰轉換成pkcs8 的格式。而後從私鑰中,釋放出公鑰。加密

可是在轉換咱們公司(B)的私鑰格式的時候卻出了問題。code

私鑰格式以下:orm

該私鑰爲行文方便,已作修改,非正確私鑰。將該私鑰保存爲test.pemblog

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命令ip

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

在網上查看資料,發現是沒有加聲明頭和聲明尾ssl

-----BEGIN PRIVATE KEY-----
這裏放置私鑰
-----END PRIVATE KEY-----

可是執行完畢以後,發現仍是報上面提示的錯誤,百思不得其解。無聊的時候,查看A公司提供的私鑰,和正常私鑰的區別。這一比較就比較出了問題。下面是正常私鑰的格式。ci

正常私鑰:

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

而後你會發現,全部的問題都迎刃而解。快樂的寫代碼吧

相關文章
相關標籤/搜索