一篇搞定RSA加密與SHA簽名|與Java完全同步

發表於2016-06-27

看到這篇文章的同學可幸福了,當時在做RSA加密與簽名的時候網上的資料簡直不要太老,做完後實在是忍受不下去了,這篇文章我會詳細講解iOS如何實現RSA加密與簽名,並且與Java完全同步,這是我的第二篇部落格,若有什麼不足之處還請大家指教。

基礎知識

  1. 什麼是RSA?
    答:RSA是一種非對稱加密演算法,常用來對傳輸資料進行加密,配合上數字摘要演算法,也可以進行文字簽名。
  2. RSA加密中padding?
    答:padding即填充方式,由於RSA加密演算法中要加密的明文是要比模數小的,padding就是通過一些填充方式來限制明文的長度。後面會詳細介紹padding的幾種模式以及分段加密。
  3. 加密和加簽有什麼區別?
    答:加密:公鑰放在客戶端,並使用公鑰對資料進行加密,服務端拿到資料後用私鑰進行解密;
    加簽:私鑰放在客戶端,並使用私鑰對資料進行加簽,服務端拿到資料後用公鑰進行驗籤。
    前者完全為了加密;後者主要是為了防惡意攻擊,防止別人模擬我們的客戶端對我們的伺服器進行攻擊,導致伺服器癱瘓。

基本原理

RSA使用“金鑰對”對資料進行加密解密,在加密解密前需要先生存公鑰(Public Key)和私鑰(Private Key)。
公鑰(Public key): 用於加密資料. 用於公開, 一般存放在資料提供方, 例如iOS客戶端。
私鑰(Private key): 用於解密資料. 必須保密, 私鑰洩露會造成安全問題。
iOS中的Security.framework提供了對RSA演算法的支援,這種方式需要對密匙對進行處理, 根據public key生成證照, 通過private key生成p12格式的密匙。想想jave直接用字串進行加密解密簡單多了。(⊙o⊙)…

實戰

證照生成

RSA加密這塊公鑰、私鑰必不可少的。Apple是不支援直接使用字串進行加密解密的,推薦使用p12檔案。這邊教大家去生成在加密中使用到的所有檔案,並提供給Java使用,想當年這個公鑰私鑰搞了半天了。 %>_

  • 生成模長為1024bit的私鑰
    openssl genrsa -out private_key.pem 1024
  • 生成certification require file
    openssl req -new -key private_key.pem -out rsaCertReq.csr
  • 生成certification 並指定過期時間
    openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt
  • 生成公鑰供iOS使用
    openssl x509 -outform der -in rsaCert.crt -out public_key.der
  • 生成私鑰供iOS使用 這邊會讓你輸入密碼,後期用到在生成secKeyRef的時候會用到這個密碼
    openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
  • 生成pem結尾的公鑰供Java使用
    openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout
  • 生成pem結尾的私鑰供Java使用openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt

以上所有的步驟都是在終端下完成的哦 (^__^)

生成公鑰和私鑰的secKeyRef

加密與解密

RSA加密中的Padding
  • RSA_PKCS1_PADDING 填充模式,最常用的模式
    要求: 輸入:必須 比 RSA 鑰模長(modulus) 短至少11個位元組, 也就是 RSA_size(rsa) – 11 如果輸入的明文過長,必須切割,然後填充。
    輸出:和modulus一樣長
    根據這個要求,對於1024bit的金鑰,block length = 1024/8 – 11 = 117 位元組
  • RSA_PKCS1_OAEP_PADDING
    輸入:RSA_size(rsa) – 41
    輸出:和modulus一樣長
  • RSA_NO_PADDING  不填充
    輸入:可以和RSA鑰模長一樣長,如果輸入的明文過長,必須切割, 然後填充
    輸出:和modulus一樣長

簽名與驗證

文章到此就結束了,希望這篇文章對大家有所幫助。想看demo的請點選:XYRSACryptor

相關文章