美文网首页
常用加密算法之非对称加密(三)

常用加密算法之非对称加密(三)

作者: _Joeyoung_ | 来源:发表于2017-12-20 15:44 被阅读21次

概念

非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。公开秘钥加密,私有密钥才能解密;私有密钥加密,公开密钥才能解密。

优缺点

优点:加密和解密用不同的密钥,与对称加密相比,其安全性更好;
缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

常用算法

非对称加密中使用的主要算法有:RSAElgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。

简析RSA算法

简介

RSA公钥加密算法是1977年由罗纳德·李维斯特
(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。
RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准
RSA可以进行数据加密和数字签名。

PKCS
Public-Key Cryptography Standards (PKCS)是由美国 RSA 数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。苹果的开发证书使用的就是P12标准。
一、数字签名:校验发送的信息是否被修改
看我画的神图:

客户端:

  • 对进行发送的数据进行HASH算法,生成字符串;对该字符串进行公钥加密;
  • 将数据报文和公钥加密后的密文一起发送给服务器;

服务端:

  • 对接收到的数据报文进行算法相同的HASH,生成字符串;
  • 对接收到的密文进行私钥解密,得到字符串;
  • 对比两个字符串是否相等,如果相等则证明数据没有被篡改。
二、数据加密

生成密钥:

//cd 到Desktop,生成512位长度的私钥
$ openssl genrsa -out private.pem 512

私钥

根据密钥生成公钥:

//根据私钥生成公钥
$ openssl rsa -in private.pem -out public.pem -pubout

公钥

查看:

//查看公钥、私钥文件
$ cat private.pem
$ cat public.pem
经过base64编码后的结果

openssl默认生成的都是PEM格式的证书,然而iOS开发中不能使用PEM格式的证书,我们需要把PEM(base64编码)转换成DER格式(二进制格式)证书。

//创建证书请求.csr(CERTIFICATE REQUEST)文件
$ openssl req -new -key private.pem -out rsacert.csr
执行完命令行,按照提示一步步完善信息即可
此时生成了一个rsacert.csr证书请求文件。
//生成证书并签名,此处我设置了有效期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
//查看证书内容
$ cat rsacert.crt
该证书是base64编码的,还需要转换一下苹果能识别的二进制文件证书
//将 CRT 格式文件转换成 DER 格式
$ openssl x509 -outform der -in rsacert.crt -out rsacert.der
该文件中包含了公钥和一些信息

接下来的代码演示中我们要把rsacert.der证书当做加密公钥来使用。

//导出p12文件(导出的时候需要设置一下密码)
$ openssl pkcs12 -export -out rsacert.p12 -inkey private.pem -in rsacert.crt

接下来的代码演示中我们要把rsacert.p12证书当做加密私钥来使用。
--------------------------------------- 代码演示 ---------------------------------------

现在证书准备齐全了,接下来就是代码演示部分。有需要的可以去GitHub上download下来。

新建项目,导入工具类和上面生成的公 / 私钥。

在需要加密的地方加载公钥和私钥。

//加载公钥
[[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]);
整体代码就这些:

执行后的结果如下,一切OK.

千里之行,始于足下~

相关文章

网友评论

      本文标题:常用加密算法之非对称加密(三)

      本文链接:https://www.haomeiwen.com/subject/cksvwxtx.html