利用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
利用BBRSACryptor实现iOS端的RSA加解密相关推荐
- java ios rsa解密乱码_java与IOS之间的RSA加解密
很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对 ...
- iOS端基于RSA公钥加密和解密
前言 最近在公司项目中被要求使用RSA加密,且要求是全程加解密,期间也是踩了很多的坑,在此做个记录也算给要使用的朋友一点帮助.注意,具体的RSA加密算法内容并不在此文的讨论范围之内.本文更多聚焦于使用 ...
- RSA加解密算法原理
本文译自http://www.muppetlabs.com/~breadbox/txt/rsa.html,作者Brian Raiter. This article is translated from ...
- 前后端java+vue 实现rsa 加解密与摘要签名算法
RSA有两个密钥,一个是公开的,称为公开密钥:一个是私密的,称为私密密钥. 特点: 公开密钥是对大众公开的,私密密钥是服务器私有的,两者不能互推得出. 用公开密钥对数据进行加密,私密密钥可解密:私密密 ...
- RSA算法原理——(3)RSA加解密过程及公式论证
上期(RSA简介及基础数论知识)为大家介绍了:互质.欧拉函数.欧拉定理.模反元素 这四个数论的知识点,而这四个知识点是理解RSA加密算法的基石,忘了的同学可以快速的回顾一遍. 一.目前常见加密算法简介 ...
- RSA加解密用途简介及java示例
在公司当前版本的中间件通信框架中,为了防止非授权第三方和到期客户端的连接,我们通过AES和RSA两种方式的加解密策略进行认证.对于非对称RSA加解密,因为其性能耗费较大,一般仅用于认证连接,不会用于每 ...
- RSA加解密的OAEP MGF1 填充解析
RSA加解密的OAEP MGF1 填充解析 加密时的填充 PKCS#1 v2.1: RSA密码学规范中关于 OAEP的模式的讲解如下: RSAES-OAEP-ENCRYPT (( n, e), M, ...
- 火山安卓RSA加解密操作
本源码转载自利快云https://www.lkuaiy.com/ 火山安卓RSA文本加解密操作 一.模块配置 1.首先右键项目配置模块 2.找到数据处理支持模块,勾选并确定即可. 二.RSA秘钥对 ...
- openssl在多平台和多语言之间进行RSA加解密注意事项
首先说一下平台和语言: 系统平台为CentOS6.3,RSA加解密时使用NOPADDING进行填充 1)使用C/C++调用系统自带的openssl 2)Android4.2模拟器,第三方openssl ...
最新文章
- 余数运算符在Java中用于Doubles
- spring-boot+swagger实现WebApi文档
- 研究科学的科学院,一开始也没那么科学!
- 得到本机或者网络上共享打印机的状态和打印任务
- php微信绑定银行卡_PHP实现微信提现功能
- Android 中 liblog 和 libcutils 的编译 trick
- [Tarjan四连] TarjanLCA
- 软考高项你想知道的都在这
- .Net Framework 4 如何静默安装
- 我为什么放弃百词斩?
- jquery更新后怎样在一个站点中使用两个版本号的jQuery
- Ubuntu下shift键失灵解决办法
- 数模技术转换应用于计算机控制,数模转换器的作用
- gentoo linux u盘安装,Gentoo系统安装步骤详解
- pdf和word等文档添加水印
- CV文章摘要中文翻译集(目标检测,纹理分类)
- 青龙面板 JDC2.0.0扫码获取cookie教程
- java视频转换flv_java使用ffmpeg转换视频为flv文件
- atlas mysql怎么用,MySQL —— Atlas 使用
- 各大搜索引擎收录地址
热门文章
- 【牛客 - 331J】炫酷数学(打表猜结论,按位枚举证明)
- Idea自带的工具打jar包和Maven打Jar包(SpringBoot工程)
- 有奶瓶的linux系统,用U盘启动BEINI(奶瓶)系统
- 华为副总鸿蒙,“哄蒙”败北!华为副总裁落实最新消息,鸿蒙3月31日正式亮剑...
- java 德生读卡器对接程序_德生TSW-F4 社保卡读卡器.rar
- leetcode359. 日志速率限制器
- leetcode13. 罗马数字转整数
- leetcode322 零钱兑换
- Redis:20---常用功能之(发布与订阅)
- 如何在Appscale下发布自己的应用(二)