背景

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加解密相关推荐

  1. java ios rsa解密乱码_java与IOS之间的RSA加解密

    很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对 ...

  2. iOS端基于RSA公钥加密和解密

    前言 最近在公司项目中被要求使用RSA加密,且要求是全程加解密,期间也是踩了很多的坑,在此做个记录也算给要使用的朋友一点帮助.注意,具体的RSA加密算法内容并不在此文的讨论范围之内.本文更多聚焦于使用 ...

  3. RSA加解密算法原理

    本文译自http://www.muppetlabs.com/~breadbox/txt/rsa.html,作者Brian Raiter. This article is translated from ...

  4. 前后端java+vue 实现rsa 加解密与摘要签名算法

    RSA有两个密钥,一个是公开的,称为公开密钥:一个是私密的,称为私密密钥. 特点: 公开密钥是对大众公开的,私密密钥是服务器私有的,两者不能互推得出. 用公开密钥对数据进行加密,私密密钥可解密:私密密 ...

  5. RSA算法原理——(3)RSA加解密过程及公式论证

    上期(RSA简介及基础数论知识)为大家介绍了:互质.欧拉函数.欧拉定理.模反元素 这四个数论的知识点,而这四个知识点是理解RSA加密算法的基石,忘了的同学可以快速的回顾一遍. 一.目前常见加密算法简介 ...

  6. RSA加解密用途简介及java示例

    在公司当前版本的中间件通信框架中,为了防止非授权第三方和到期客户端的连接,我们通过AES和RSA两种方式的加解密策略进行认证.对于非对称RSA加解密,因为其性能耗费较大,一般仅用于认证连接,不会用于每 ...

  7. RSA加解密的OAEP MGF1 填充解析

    RSA加解密的OAEP MGF1 填充解析 加密时的填充 PKCS#1 v2.1: RSA密码学规范中关于 OAEP的模式的讲解如下: RSAES-OAEP-ENCRYPT (( n, e), M, ...

  8. 火山安卓RSA加解密操作

    本源码转载自利快云https://www.lkuaiy.com/ 火山安卓RSA文本加解密操作   一.模块配置 1.首先右键项目配置模块 2.找到数据处理支持模块,勾选并确定即可. 二.RSA秘钥对 ...

  9. openssl在多平台和多语言之间进行RSA加解密注意事项

    首先说一下平台和语言: 系统平台为CentOS6.3,RSA加解密时使用NOPADDING进行填充 1)使用C/C++调用系统自带的openssl 2)Android4.2模拟器,第三方openssl ...

最新文章

  1. 余数运算符在Java中用于Doubles
  2. spring-boot+swagger实现WebApi文档
  3. 研究科学的科学院,一开始也没那么科学!
  4. 得到本机或者网络上共享打印机的状态和打印任务
  5. php微信绑定银行卡_PHP实现微信提现功能
  6. Android 中 liblog 和 libcutils 的编译 trick
  7. [Tarjan四连] TarjanLCA
  8. 软考高项你想知道的都在这
  9. .Net Framework 4 如何静默安装
  10. 我为什么放弃百词斩?
  11. jquery更新后怎样在一个站点中使用两个版本号的jQuery
  12. Ubuntu下shift键失灵解决办法
  13. 数模技术转换应用于计算机控制,数模转换器的作用
  14. gentoo linux u盘安装,Gentoo系统安装步骤详解
  15. pdf和word等文档添加水印
  16. CV文章摘要中文翻译集(目标检测,纹理分类)
  17. 青龙面板 JDC2.0.0扫码获取cookie教程
  18. java视频转换flv_java使用ffmpeg转换视频为flv文件
  19. atlas mysql怎么用,MySQL —— Atlas 使用
  20. 各大搜索引擎收录地址

热门文章

  1. 【牛客 - 331J】炫酷数学(打表猜结论,按位枚举证明)
  2. Idea自带的工具打jar包和Maven打Jar包(SpringBoot工程)
  3. 有奶瓶的linux系统,用U盘启动BEINI(奶瓶)系统
  4. 华为副总鸿蒙,“哄蒙”败北!华为副总裁落实最新消息,鸿蒙3月31日正式亮剑...
  5. java 德生读卡器对接程序_德生TSW-F4 社保卡读卡器.rar
  6. leetcode359. 日志速率限制器
  7. leetcode13. 罗马数字转整数
  8. leetcode322 零钱兑换
  9. Redis:20---常用功能之(发布与订阅)
  10. 如何在Appscale下发布自己的应用(二)