RSA加密解密中pkcs1與pkcs8格式私鑰互相轉換

net,ios中rsa加解密使用的是pkcs1,而java使用的是pkcs8html

若是是按1024取模(一般都是1024),pkcs1格式的私鑰長度應該是812。若是是pkcs8的格式的密鑰長度爲861。java

下載安裝openssl:https://pan.baidu.com/s/1ggQJIIRios

我這邊使用的是Win64OpenSSL_Light-1_1_0g.exe算法

PKCS1私鑰生成:安全

OpenSSL> genrsa -out pkcs1_private.pem 1024 Generating RSA private key, 1024 bit long modulus .........++++++ .............................++++++ e is 65537 (0x10001)

內容:加密

-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQCYMTaH4NMw5fQsgx3pv8xaAxhOdtUz/m5nfl9XHtGboXNzUzx/ ehh8c3RgpGcig83JXOYOXafmx3OS28Ed3e2fmC5Yo5RD6DRHnBCid28EjQ5PgCTd dNqDvcXU3YMH4sO1qNBx5MQpk92Kt/NdquIJmzhgpjP15MO5CFHcU90ZvQIDAQAB AoGANlvdjkrPI/f+bqemV4caBkx0shHftOJ7rJuGkid/1oakJdzlDuMdO9ZBCwOt krZhGjsEML1i6xryPNIg9/n8lSdQqIUW61HXYwKUK5xQWz/MstWbbIx3t5driQFR Fv53NLdemeF/0AJiD5COO1fkoM+1By2LlI0ths8cQLcOpgECQQDIc46yV1N5IuS0 MYD0LgggaJ08WF0PrwjXgs+DRp3+ZE5WTs1JDkBQM9E598xbmy7AAFtdtR3L5CH8 5Qh+KfwJAkEAwl4MuRMdIjiHiw1YoIUliy6t3XPvxeOEiG/P15adKrxI5A5QylM0 TtbZT3YZurdy3nrJ75LxuU9cSYKzxtVFFQJAMboJElD7kjeHyPPm66xns7KAHzJE k9l2NhBrbkOcejlj/aE65/6zEbJpGxpQBgGvTU5JXCvMIoKLs/MVckb0EQJASze+ ULkW4zFhMuy9SZF9T/mGi1bciYZcubgbhODifbFTu/3WQhYk/gWjH18i4eEwcOyv zSjepsoRetk73UyXaQJAOfr3Gg1dGvoLiwZ3fXoDVupahnKg73SAd72+24qQs2AT 16T8FKop259xisLu+WSUTfSUhao5qOpZJ/PTwFRlzw==
-----END RSA PRIVATE KEY-----

PKCS1私鑰轉換爲PKCS8(該格式通常Java調用)spa

OpenSSL>  pkcs8 -topk8 -inform PEM -in pkcs1_private.pem -outform pem -nocrypt -out pkcs8_private.pem

內容:.net

-----BEGIN PRIVATE KEY----- MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJgxNofg0zDl9CyD Hem/zFoDGE521TP+bmd+X1ce0Zuhc3NTPH96GHxzdGCkZyKDzclc5g5dp+bHc5Lb wR3d7Z+YLlijlEPoNEecEKJ3bwSNDk+AJN102oO9xdTdgwfiw7Wo0HHkxCmT3Yq3 812q4gmbOGCmM/Xkw7kIUdxT3Rm9AgMBAAECgYA2W92OSs8j9/5up6ZXhxoGTHSy Ed+04nusm4aSJ3/WhqQl3OUO4x071kELA62StmEaOwQwvWLrGvI80iD3+fyVJ1Co hRbrUddjApQrnFBbP8yy1ZtsjHe3l2uJAVEW/nc0t16Z4X/QAmIPkI47V+Sgz7UH LYuUjS2GzxxAtw6mAQJBAMhzjrJXU3ki5LQxgPQuCCBonTxYXQ+vCNeCz4NGnf5k TlZOzUkOQFAz0Tn3zFubLsAAW121HcvkIfzlCH4p/AkCQQDCXgy5Ex0iOIeLDVig hSWLLq3dc+/F44SIb8/Xlp0qvEjkDlDKUzRO1tlPdhm6t3LeesnvkvG5T1xJgrPG 1UUVAkAxugkSUPuSN4fI8+brrGezsoAfMkST2XY2EGtuQ5x6OWP9oTrn/rMRsmkb GlAGAa9NTklcK8wigouz8xVyRvQRAkBLN75QuRbjMWEy7L1JkX1P+YaLVtyJhly5 uBuE4OJ9sVO7/dZCFiT+BaMfXyLh4TBw7K/NKN6myhF62TvdTJdpAkA5+vcaDV0a +guLBnd9egNW6lqGcqDvdIB3vb7bipCzYBPXpPwUqinbn3GKwu75ZJRN9JSFqjmo 6lkn89PAVGXP -----END PRIVATE KEY-----

生成公鑰:設計

PKCS1的私鑰生成公鑰:3d

OpenSSL> rsa -in pkcs1_private.pem -pubout -out pkcs1_public.pem writing RSA key

內容:

-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYMTaH4NMw5fQsgx3pv8xaAxhO dtUz/m5nfl9XHtGboXNzUzx/ehh8c3RgpGcig83JXOYOXafmx3OS28Ed3e2fmC5Y o5RD6DRHnBCid28EjQ5PgCTddNqDvcXU3YMH4sO1qNBx5MQpk92Kt/NdquIJmzhg pjP15MO5CFHcU90ZvQIDAQAB -----END PUBLIC KEY-----

PKCS8的私鑰生成公鑰:

OpenSSL> rsa -in pkcs8_private.pem -pubout -out pkcs8_public.pem writing RSA key

內容:

-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYMTaH4NMw5fQsgx3pv8xaAxhO dtUz/m5nfl9XHtGboXNzUzx/ehh8c3RgpGcig83JXOYOXafmx3OS28Ed3e2fmC5Y o5RD6DRHnBCid28EjQ5PgCTddNqDvcXU3YMH4sO1qNBx5MQpk92Kt/NdquIJmzhg pjP15MO5CFHcU90ZvQIDAQAB -----END PUBLIC KEY-----

結果發現兩個公鑰都是同樣的。

下面連接裏面有在線生產地址:http://tool.chacuo.net/cryptrsapkcs1pkcs8

上面的轉換都沒有私鑰密碼

注意:

使用rsa進行加密的時候,若是報不正常長度,那麼就要進行分段加解密。

RSA加解密: 1024位的證書,加密時最大支持117個字節,解密時爲128; 2048位的證書,加密時最大支持245個字節,解密時爲256。 加密時支持的最大字節數:證書位數/8 -11(好比:2048位的證書,支持的最大加密字節數:2048/8 - 11 = 245) .NET中的RSA加密算法爲了提升安全性,在待加密數據前要添加一些隨機數,所以,使用.NET中的RSA加密算法一次最多加密117字節數據(多於117字節須要拆分紅多段分別加密再鏈接起來),通過加密後獲得一個長度爲128字節的加密數據。 RSA實際可加密的明文長度最大也是1024bits,但問題就來了:若是小於這個長度怎麼辦?就須要進行padding,由於若是沒有padding,用戶沒法區分解密後內容的真實長度,字符串之類的內容問題還不大,以0做爲結束符,

但對二進制數據就很難理解,由於不肯定後面的0是內容仍是內容結束符。只要用到padding,那麼就要佔用實際的明文長度,因而纔有117字節的說法。
咱們通常使用的padding標準有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建議的padding就佔用了11個字節。
若是大於這個長度怎麼辦?不少算法的padding每每是在後邊的,但PKCS的padding則是在前面的,此爲有意設計,有意的把第一個字節置0以確保m的值小於n。
這樣,128字節(1024bits)
-減去11字節正好是117字節,但對於RSA加密來說,padding也是參與加密的,因此,依然按照1024bits去理解,但實際的明文只有117字節了。

在對接中使用流程:

一共有兩組四個密鑰:A的公鑰(PUB_A),A的私鑰(PRI_A);B的公鑰(PUB_B),B的私鑰(PRI_B)。 公鑰通常用來加密,私鑰用來簽名。 一般公鑰是公開出去的,可是私鑰只能本身私密持有。 公鑰和私鑰惟一對應,用某個公鑰簽名過得內容只能用對應的私鑰才能解籤驗證;一樣用某個私鑰加密的內容只能用對應的公鑰才能解密。 這時A向B發送信息的整個簽名和加密的過程以下: 1、A先用本身的私鑰(PRI_A)對信息(通常是信息的摘要)進行簽名。 2、A接着使用B的公鑰(PUB_B)對信息內容和簽名信息進行加密。 這樣當B接收到A的信息後,獲取信息內容的步驟以下: 1、用本身的私鑰(PRI_B)解密A用B的公鑰(PUB_B)加密的內容; 2、獲得解密後的明文後用A的公鑰(PUB_A)解籤A用A本身的私鑰(PRI_A)的簽名。 從而整個過程就保證了開始說的端到端的惟一確認。A的簽名只有A的公鑰才能解籤,這樣B就能確認這個信息是A發來的;A的加密只有B的私鑰才能解密,這樣A就能確認這份信息只能被B讀取。

可是在個人使用過程當中,發現只能公鑰加密,私鑰解密,反之則不能夠,私鑰能夠用來加簽,對應的公鑰能夠用來驗籤。(應該是我哪裏沒搞懂,因此在不能私鑰加密,公鑰解密)

如今通常對接就是

1.用對方的私鑰對消息進行加簽生成sign,再將消息message跟sign使用對方的公鑰進行加密

2.對方接收到數據之後,先用本身的私鑰進行解密,再用私鑰對解密出來的message進行加簽,與傳遞過來的sign進行對比

 

RSA只是一個加密的算法,加簽須要先對內容進行HASH而後再加密,好比SHA1WithRSA就是一個經常使用的RSA加簽算法。

https://www.jianshu.com/p/08e41304edab

http://www.javashuo.com/article/p-guhfakaj-bv.html

相關文章
相關標籤/搜索