![](https://img.haomeiwen.com/i3265534/011ca24908c0a5db.jpg)
概念
非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。公开秘钥加密,私有密钥才能解密;私有密钥加密,公开密钥才能解密。
优缺点
优点:加密和解密用不同的密钥,与对称加密相比,其安全性更好;
缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
常用算法
非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
简析RSA算法
简介
RSA公钥加密算法是1977年由罗纳德·李维斯特
(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。
RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
RSA可以进行数据加密和数字签名。
![](https://img.haomeiwen.com/i3265534/bce66bdbd3559778.png)
PKCS
Public-Key Cryptography Standards (PKCS)是由美国 RSA 数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。苹果的开发证书使用的就是P12标准。![](https://img.haomeiwen.com/i3265534/1a62864c194eac44.png)
![](https://img.haomeiwen.com/i3265534/ebaa96e9ba27a8a6.png)
一、数字签名:校验发送的信息是否被修改
看我画的神图:![](https://img.haomeiwen.com/i3265534/2d9c05b02350bd70.png)
客户端:
- 对进行发送的数据进行HASH算法,生成字符串;对该字符串进行公钥加密;
- 将数据报文和公钥加密后的密文一起发送给服务器;
服务端:
- 对接收到的数据报文进行算法相同的HASH,生成字符串;
- 对接收到的密文进行私钥解密,得到字符串;
- 对比两个字符串是否相等,如果相等则证明数据没有被篡改。
二、数据加密
生成密钥:
//cd 到Desktop,生成512位长度的私钥
$ openssl genrsa -out private.pem 512
![](https://img.haomeiwen.com/i3265534/23027df8b69f9291.png)
![](https://img.haomeiwen.com/i3265534/236695ef5f515fc4.png)
根据密钥生成公钥:
//根据私钥生成公钥
$ openssl rsa -in private.pem -out public.pem -pubout
![](https://img.haomeiwen.com/i3265534/9600b8f6d7e28d1f.png)
![](https://img.haomeiwen.com/i3265534/202049077e29ca15.png)
查看:
//查看公钥、私钥文件
$ cat private.pem
$ cat public.pem
![](https://img.haomeiwen.com/i3265534/b1124e039c721ed5.png)
openssl默认生成的都是PEM格式的证书,然而iOS开发中不能使用PEM格式的证书,我们需要把PEM(base64编码)转换成DER格式(二进制格式)证书。
//创建证书请求.csr(CERTIFICATE REQUEST)文件
$ openssl req -new -key private.pem -out rsacert.csr
![](https://img.haomeiwen.com/i3265534/352d1f0779135c9d.png)
此时生成了一个
rsacert.csr
证书请求文件。![](https://img.haomeiwen.com/i3265534/958cda4864047c1c.png)
//生成证书并签名,此处我设置了有效期10年(3650),相当于4~5万元了 哈哈.
//如果做HTTPS的话,.crt格式的证书就是部署在服务端的证书
//x509:一种非常通用的证书格式,ITU-T X.509国际标准
$ openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
![](https://img.haomeiwen.com/i3265534/9043d48cc15defda.png)
//查看证书内容
$ cat rsacert.crt
![](https://img.haomeiwen.com/i3265534/70a194bb9ef7125f.png)
//将 CRT 格式文件转换成 DER 格式
$ openssl x509 -outform der -in rsacert.crt -out rsacert.der
![](https://img.haomeiwen.com/i3265534/813700ae2e48c5ef.png)
接下来的代码演示中我们要把rsacert.der
证书当做加密公钥来使用。
//导出p12文件(导出的时候需要设置一下密码)
$ openssl pkcs12 -export -out rsacert.p12 -inkey private.pem -in rsacert.crt
![](https://img.haomeiwen.com/i3265534/25360f7342cc9e42.png)
接下来的代码演示中我们要把
rsacert.p12
证书当做加密私钥来使用。
--------------------------------------- 代码演示 ---------------------------------------
现在证书准备齐全了,接下来就是代码演示部分。有需要的可以去GitHub上download下来。
新建项目,导入工具类和上面生成的公 / 私钥。
![](https://img.haomeiwen.com/i3265534/753cd81de32f586a.png)
在需要加密的地方加载公钥和私钥。
//加载公钥
[[RSACryptor sharedRSACryptor] loadPublicKey:[[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil]];
//加载私钥
//password:生成p12时设置的密码
[[RSACryptor sharedRSACryptor] loadPrivateKey:[[NSBundle mainBundle] pathForResource:@"rsacert.p12" ofType:nil] password:@"123456"];
我在viewController
中添加了一个touchesBegan
方法,当我点击view的时候执行加密解密;
//加密
NSData *result = [[RSACryptor sharedRSACryptor] encryptData:[@"hello everyone." dataUsingEncoding:NSUTF8StringEncoding]];
//base64 编码
NSString *base64 = [result base64EncodedStringWithOptions:0];
NSLog(@"加密的信息: %@",base64);
//解密
NSData *decryption = [[RSACryptor sharedRSACryptor] decryptData:result];
NSLog(@"解密信息: %@",[[NSString alloc]initWithData:decryption encoding:NSUTF8StringEncoding]);
整体代码就这些:
![](https://img.haomeiwen.com/i3265534/946435568db686b4.png)
执行后的结果如下,一切OK.
![](https://img.haomeiwen.com/i3265534/1251916031ad9ac3.png)
千里之行,始于足下~
网友评论