iOS中使用RSA對資料進行加密解密

發表於2016-03-15

RSA演算法是一種非對稱加密演算法,常被用於加密資料傳輸.如果配合上數字摘要演算法, 也可以用於檔案簽名.

本文將討論如何在iOS中使用RSA傳輸加密資料.

本文環境

  • mac os
  • openssl-1.0.1j, openssl需要使用1.x版本, 推薦使用[homebrew](http://brew.sh/)安裝.
  • Java 8

RSA基本原理

RSA使用”祕匙對”對資料進行加密解密.在加密解密資料前,需要先生成公鑰(public key)和私鑰(private key).

  • 公鑰(public key): 用於加密資料. 用於公開, 一般存放在資料提供方, 例如iOS客戶端.
  • 私鑰(private key): 用於解密資料. 必須保密, 私鑰洩露會造成安全問題.

iOS中的Security.framework提供了對RSA演算法的支援.這種方式需要對密匙對進行處理, 根據public key生成證照, 通過private key生成p12格式的密匙.

除了Secruty.framework, 也可以將openssl庫編譯到iOS工程中, 這可以提供更靈活的使用方式.

本文使用Security.framework的方式處理RSA.

使用openssl生成密匙對

Github Gist: https://gist.github.com/lvjian700/635368d6f1e421447680

Tips:

  • 在建立證照的時候, terminal會提示輸入證照資訊. 根據wizard輸入對應資訊就OK.
  • 在建立p12密匙時, 會提示輸入密碼, 此時的密碼必須記住, 之後會用到.
  • 如果上面指令有問題,請參考最新的openssl官方文件, 以官方的為準. 之前在網上搜尋指令, 被坑了一圈之後, 還是會到啃官方文件上. 每條指令文件在最後都會有幾個sample,參考sample即可.

iOS如何載入使用證照

將下面程式碼新增到專案中:

https://gist.github.com/lvjian700/204c23226fdffd6a505d

程式碼依賴Base64編碼庫, 如果使用cocoapods, 可以講下面依賴新增到Podfile:

加密資料

__[rsa rsaEncryptString:securityText]__會返回decrypted base64編碼的字串:

console out 寫道
encrypted data: I1Mnu33cU7QcgaC9uo2bxV0vyfJSqAwyC3DZ+p8jm0G2EmcClarrR5R2xLDdXqvtKj+UJbES7TT+AgkK1NDoQvOJBY+jkmrpAchmRbV2jvi3cEZYQG955jrdSAu21NzQe8xWtEc3YzP+TACPdP4B3Cyy0u8N2RcSFWyxu0YKPXE=

解密資料

在iOS下解碼需要先載入private key, 之後在對資料解碼. 解碼的時候先進行Base64 decode, 之後在用private key decrypt加密資料.

之後會輸出解密後的資料:

console 寫道
decryptor using rsa
decrypted data: hello ~

在伺服器端解碼資料(Java)

在Java中解碼需要使用下述指令生成的pkcs8 private key:

gen shell 寫道
openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt

具體解碼步驟:

  1. 載入pkcs8 private key:
    1. 讀取private key檔案
    2. 去掉private key頭尾的”—–BEGIN PRIVATE KEY—–“和”—–BEGIN PRIVATE KEY—–“
    3. 刪除private key中的換行
    4. 對處理後的資料進行Base64解碼
    5. 使用解碼後的資料生成private key.
  2. 解密資料:
    1. 對資料進行Base64解碼
    2. 使用RSA decrypt資料.

這裡我將iOS中”hello ~”加密的資料在Java中進行解碼:

直行成功後控制檯會輸出”hello ~”.

總結

這種加密傳輸方式會被用在網銀類App中.雖然網銀會採用全站https方案, 但是在安全登入這塊會使用另一個證照對登入資訊加密, 這樣可以雙層確保資料安全.

基於RSA加密解密演算法, 還可以將其運用在數字簽名場景.以後有空在聊如何使用RSA演算法實現對檔案的數字簽名.

參考資料

相關文章