利用BBRSACryptor實現iOS端的RSA加解密

背景

RSA這種非對稱加密被廣泛的運用于網絡數據的傳輸,但其在iOS上很難直接實現,BBRSACryptor框架通過移植openssl實現了iOS端的RSA,本文將介紹如何使用BBRSACryptor生成證書,加載公鑰,以及后端如何用php讀取證書,加載私鑰。

iOS加密

新建工程并集成BBRSACryptor

這個框架自帶的demo將工程文件與框架放在了同一目錄,因此在配置Header Search Paths時沒有包含工程文件夾,一定注意,下面新建的工程將框架放在了工程文件夾內,因此頭文件尋找路徑需要包含上工程目錄。詳細步驟如下。
1. 新建一個iOS工程,將BBRSACryptor、GTMBase64、OpenSSL三個文件夾拖入工程,目錄結構如下。
工程目錄結構

2.在Build Settings中配置Header Search Pathes。
頭文件搜索路徑
注意最前面的文件夾名稱要和自己的工程名相同

3.打開BBRSACryptor.m文件,修改存儲證書的目錄和文件路徑,默認的是隱藏目錄(前加點),為了方便查看與復制證書,建議將路徑前面的點去掉,例如:

#define OpenSSLRSAKeyDir [DocumentsDir stringByAppendingPathComponent:@"openssl_rsa"]
#define OpenSSLRSAPublicKeyFile [OpenSSLRSAKeyDir stringByAppendingPathComponent:@"publicKey.pem"]
#define OpenSSLRSAPrivateKeyFile [OpenSSLRSAKeyDir stringByAppendingPathComponent:@"privateKey.pem"]

4.打開ViewController.m,導入BBRSACryptor.h和GTMBase64.h,使用下面的代碼生成證書。

BBRSACryptor *rsaCryptor = [[BBRSACryptor alloc] init];
[rsaCryptor generateRSAKeyPairWithKeySize:1024];

運行后,在控制臺會打印出證書路徑,進入路徑后,可以看到公鑰和私鑰證書。
證書

5.使用TextEdit打開公鑰證書,將—–BEGIN PUBLIC KEY—–和—–END PUBLIC KEY—–之間的部分復制,然后在工程中新建一個宏,來保存這個公鑰,以便后續讀取。

#define PublicKey \
@"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjYyZoASYgT+MIc/5YkSJngRbNYEQEI3UF7RVijF0STcMs93pH0qhjLJIQnsvUn2ghEVM4X+S+tQ0XhS+7tmL1UMEFgDgYwG/xr/ZjUozgQyvqeUejA08pbun0E0/Yx9WuBQfCpCc5vNka/ENDZEy/2PbEO5KD3hgsnH1JyNqNnwIDAQAB"

客戶端僅保存公鑰即可,私鑰放在服務器上。使用php可以直接讀取證書。

6.在客戶端加載公鑰與進行加密
前面已經創建了宏,以后通過宏即可加載公鑰。如下:

BBRSACryptor *rsaCryptor = [[BBRSACryptor alloc] init];
// PublicKey是從公鑰證書中復制的內容創建的宏,見上文。
[rsaCryptor importRSAPublicKeyBase64:PublicKey];
NSData *data = [rsaCryptor encryptWithPublicKeyUsingPadding:RSA_PADDING_TYPE_PKCS1 plainData:[@"客戶端加密的內容" dataUsingEncoding:NSUTF8StringEncoding]];
NSString *baseStr = [GTMBase64 stringByEncodingData:data];
NSLog(@"%@",baseStr);

先加載公鑰,然后把要加密的內容轉換成NSData,加密后的內容先進行base64編碼后再傳輸。為了驗證能夠解密,最后對base64編碼的加密內容進行了打印,將這個內容先復制到剪貼板,后面貼在php中進行解密。

php解密

為了方便,將按照上文方法生成的私鑰證書復制到服務器的某個目錄,并在這個目錄下創建一個php文件,并添加如下代碼:

<?phpheader("Content-type:text/html; charset=utf-8");/*** 密鑰文件的路徑*/$privateKeyFilePath = 'privateKey.pem';/*** 公鑰文件的路徑*/$publicKeyFilePath = 'publicKey.pem';extension_loaded('openssl') or die('php需要openssl擴展支持');(file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath))or die('密鑰或者公鑰的文件路徑不正確');/*** 生成Resource類型的密鑰,如果密鑰文件內容被破壞,openssl_pkey_get_private函數返回false*/$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));/*** 生成Resource類型的公鑰,如果公鑰文件內容被破壞,openssl_pkey_get_public函數返回false*/$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));($privateKey && $publicKey) or die('密鑰或者公鑰不可用');// 這段內容來自上面iOS端打印的加密內容的base64編碼$encryptData = 'J0oTqBCNbsJauVwRz+380y519sSa7ficUO1NvRKiMGKUGJF0pomOu20fHqC77NmsKle9/L4DyYNr3xDgDa4SpO0in39rA9EYXzmx3rlyI1c8iPjAkQ6XpwZk7BsThiCFB/6QmkTW5pMIo4b0axRv/4lq1Rqx/YtuIsGkXQTNntI=';$ee = base64_decode($encryptData);$decryptData ='';if (openssl_private_decrypt($ee, $decryptData, $privateKey)) {echo '解密成功,解密后數據為:', $decryptData, PHP_EOL;} else {die('解密成功');}
?>

訪問這個腳本,如果前面做的沒有問題,會得到解密的結果:
這里寫圖片描述

php加密

使用私鑰加密后,可以在客戶端利用公鑰解密。使用下面的代碼進行加密。

<?phpheader("Content-type:text/html; charset=utf-8");/*** 密鑰文件的路徑*/$privateKeyFilePath = 'privateKey.pem';/*** 公鑰文件的路徑*/$publicKeyFilePath = 'publicKey.pem';extension_loaded('openssl') or die('php需要openssl擴展支持');(file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath))or die('密鑰或者公鑰的文件路徑不正確');/*** 生成Resource類型的密鑰,如果密鑰文件內容被破壞,openssl_pkey_get_private函數返回false*/$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));/*** 生成Resource類型的公鑰,如果公鑰文件內容被破壞,openssl_pkey_get_public函數返回false*/$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));($privateKey && $publicKey) or die('密鑰或者公鑰不可用');
$originalData = '服務器加密的內容';/*** 加密以后的數據,用于在網路上傳輸*/$encryptData = '';echo '原數據為:', $originalData, PHP_EOL;///用私鑰加密if (openssl_private_encrypt($originalData, $encryptData, $privateKey)) {echo '加密成功,加密后數據(base64_encode后)為:', base64_encode($encryptData), PHP_EOL;} else {  die('加密失敗');  }
?>

訪問腳本后會打印出加密的base64編碼,將這個編碼復制到客戶端進行解密,來驗證可用性。

iOS解密

要在iOS端解密,和加密類似,先加載公鑰,然后把base64編碼的加密內容解碼,解密后轉為NSString即可。

BBRSACryptor *rsaCryptor = [[BBRSACryptor alloc] init];
[rsaCryptor importRSAPublicKeyBase64:PublicKey];
NSData *enCryptorDataBase64 = [@"aWdbPQHiQzU5CUOAIGQT3OD/MPqcqoXHXDFtYQPVRo9/Mb1S/aVcKQVHDjBpLgfzw+0mWxgHN6SuOfH8z9WobgQrTZh+pxhau3DnfukLmENGPWVMqquWMxTkEU7yCkx/RI7XEwv3jk9d4UgFOv35eqNUgYyWDq2gGatEpfnUg6U=" dataUsingEncoding:NSUTF8StringEncoding];
NSData *deCryptorData = [rsaCryptor decryptWithPublicKeyUsingPadding:RSA_PADDING_TYPE_PKCS1 cipherData:[GTMBase64 decodeData:enCryptorDataBase64]];
NSLog(@"%@",[[NSString alloc] initWithData:deCryptorData encoding:NSUTF8StringEncoding]);

不出意外的話,控制臺將會打印出解密后的內容。

轉載于:https://www.cnblogs.com/aiwz/p/6154011.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458390.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UIView轉UIimage

/** 將 UIView 轉換成 UIImage param view 將要轉換的View return 新生成的 UIImage 對象 */ - (UIImage *)yj_convertCreateImageWithUIView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); CGContextRef ctx UIGraphicsGetCurrentContext…

Linq 合并數據并相加

有幾條數據是這樣的 Person 123 456 789 Person 321 654 987 想合并成 Person 444 1110 1776 直接一條linq搞定 var newQuery from p in query group p by p.Name into gselect new { Name g.Name, Value g.Sum(x > x.Value) }; 轉…

python 各種模塊學習

from&#xff1a;https://blog.csdn.net/weiwangchao_/article/details/70570508轉載&#xff1a;。。。。Python的模塊大全&#xff0c;很全&#xff0c;有詳細介紹&#xff01;另外附Python兩個教程1. Python詳細教程&#xff08;廖雪峰的官方網站&#xff0c;語言簡潔&#…

Linux(Fedora21)安裝google chrome瀏覽器

2019獨角獸企業重金招聘Python工程師標準>>> Linux(Fedora21)安裝Google Chrome瀏覽器 qianghaoaho(孤狼) 1.添加google chrome的源&#xff1a; cd /etc/yum.repos.d/ vim chrome.repo添加如下內容&#xff1a; [google64] …

啟動頁更換圖片后,加載不出來

這個問題&#xff0c;重啟一下手機就可以了&#xff0c;我的就是這么解決的。

R-大數據分析挖掘(5-R基礎回顧)

&#xff08;一&#xff09;R函數 R是一種解析型語言&#xff0c;輸入后可直接獲取結果 函數&#xff08;輸入參數&#xff0c;參數&#xff09; R的函數分為“高級”和“低級函數”     ??高級函數可調用低級函數     ??高級函數稱為泛型函數 ??函數名 <-‐…

jquery點擊label觸發2次的問題

今天寫問卷的時候遇到個label點擊的時候&#xff0c;監聽的click事件被執行兩次&#xff1b;產生這個的原因么。。。事件冒泡 <div class"questionBox checkBox"><div class"title"> 2.你如何理解創新意識的重要性?</div><div class…

git本地項目管理

Git 基本工作流程 | git倉庫 | 暫存區 | 工作目錄 | | ---------------- | ------------------ | ------------------- | | 用于存放提 交記錄 | 臨時存放被修改文件 | 被Git管理的項目目錄 | Git 的使用 1.5.1 Git 使用前配置 在使用 git 前&#xff0c;需要告訴 git 你…

Python中self用法詳解

在介紹Python的self用法之前&#xff0c;先來介紹下Python中的類和實例…… 我們知道&#xff0c;面向對象最重要的概念就是類&#xff08;class&#xff09;和實例&#xff08;instance&#xff09;&#xff0c;類是抽象的模板&#xff0c;比如學生這個抽象的事物&#xff0c;…

siwft初學(一)

今天剛開始學習swift語言。首先須要下載xcode6 beta版本號。正式版本號然后會公布。自己學習總結一下&#xff0c;假設有誤。請大家指出。 創建project的時候。language選擇swift語言。 swift語言比起c&#xff0c;oc很的簡潔。開始真有點不適應&#xff0c;沒有main函數&#…

python簡單爬蟲(一)

學習python前糾結了下&#xff0c;到底是應該一個個知識點吃透&#xff0c;然后寫些小程序。還是應該快速掌握基礎語法&#xff0c;快速實踐。思考后認為前者這么學習速度真心不高&#xff0c;于是花2天時間看了下python3的語法&#xff0c;雖然很多都不明白&#xff0c;但是帶…

Github遠程倉庫管理

1. Github 在版本控制系統中&#xff0c;大約90%的操作都是在本地倉庫中進行的&#xff1a;暫存&#xff0c;提交&#xff0c;查看狀態或者歷史記錄等等。除此之外&#xff0c;如果僅僅只有你一個人在這個項目里工作&#xff0c;你永遠沒有機會需要設置一個遠程倉庫。 只有當…

oracle 中的trunc()函數及加一個月,一天,一小時,一分鐘,一秒鐘方法

返回處理后的數據&#xff0c;不同于round()&#xff08;對數值進行四舍五入處理&#xff09;&#xff0c;該函數不對指定小數前或后的數值部分進行舍入處理。 語法&#xff1a;trunc(number[,decimals]) 其中&#xff0c;number為待做處理的數值&#xff0c;decimals為需要保留…

【Halcon】Halcon與OpenCV介紹、比較

from:https://blog.csdn.net/taily_duan/article/details/514997691.MVTec HALCONMVTec HALCON 是世界上最全能的機器視覺軟件.世界各地的用戶從HALCON為快速開發圖像分析和機器視覺程序的靈活架構獲益匪淺.HALCON 提供了超過1100多種具備突出性能控制器的庫,如模糊分析,形態,模…

直接拿來用!最火的Android開源項目(完結篇)

直接拿來用&#xff01;最火的Android開源項目&#xff08;完結篇&#xff09; 2014-01-06 19:59 4785人閱讀 評論(1) 收藏 舉報 分類&#xff1a;android 高手進階教程&#xff08;100&#xff09; 摘要&#xff1a;截至目前&#xff0c;在GitHub“最受歡迎的開源項目”系…

ABP理論學習之Web API控制器(新增)

返回總目錄 本篇目錄 介紹AbpApiController基類 本地化審計日志授權工作單元其他介紹 ABP通過Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器。你可以像以往創建Asp.Net Web API控制器那樣創建Web API控制器。依賴注入對于有規律的ApiController&#xff08;其實就是繼承自Ab…

C++類構造函數初始化列表及初始化成員變量的誤區

構造函數初始化列表以一個冒號開始&#xff0c;接著是以逗號分隔的數據成員列表&#xff0c;每個數據成員后面跟一個放在括號中的初始化式。例如&#xff1a;[cpp] view plaincopyclass CExample { public: int a; float b; //構造函數初始化列表 CExampl…

將centos7打造成桌面系統

前言 以下所有操作默認在root權限下執行&#xff0c;桌面環境是kde&#xff0c;使用gnome的也可以參考一下。我收集的以下要用到的一些安裝包&#xff0c;360網盤http://yunpan.cn/csMhBAp92vTgN 提取碼 92e2以下要用的安裝軟件語法&#xff1a;通過軟件源在線安裝&#xff1a;…

VC2010打開資源視圖時提示“指南必須指定類型”,.rc資源文件損壞(轉)

VC: 打開資源視圖時提示“指南必須指定類型 ”(Guideline……specify type) &#xff0c;.rc資源文件損壞 可能是TFS導致的使用記事本打開.rc文件&#xff0c;找到“DESIGNINFO”節&#xff0c;會看到如下的數據&#xff1a; BEGIN , 50 , 13798327 EN…

C++ virtual 析構函數

copy自:http://zxjgoodboy.blog.sohu.com/61482463.html 在此基礎上稍作修改C中虛析構函數的作用 我們知道&#xff0c;用C開發的時候&#xff0c;用來做基類的類的析構函數一般都是虛函數。可是&#xff0c;為什么要這樣做呢&#xff1f;下面用一個小例子來說明&#xff1a; …