该文章是《揭开RSA神秘面纱(ios篇)》系列第二篇,建议插队的童鞋从第一篇开始看,传送门:
<a href='http://www.jianshu.com/p/84d925e4a57d'><h5>解开RSA神秘面纱(一):初识RSA</a>
初体验
<p>心急的童鞋们,准备好了么,让我们来体验下RSA的工作原理吧。先来体验下效果,github代码地址:
<a href='https://github.com/Vken-Chen/RSADemo1'>https://github.com/Vken-Chen/RSADemo1</a>
赶紧下载运行下
<p>简单描述下Demo的使用:
<li>1,点击TestEncrypt</li>
<li>2,点击TestDecrypt,点开Log窗口,查看打印的日志</li>
<p>bingo!加密解密两个步骤成功执行了!是不是觉得RSA并不是想象中的那么难。细心的童鞋肯定会Debug单步去跟踪过程(为这些童鞋点赞)。
1. 疑问
运行了Demo,第一反应是高兴,第二反应肯定会产生疑问:
<li>1,Demo中的公钥和私钥是怎么来的?</li>
<li>2,VKRSA和VKRSAKeyHelper这两个类代码看上去好复杂,怎么去理解?</li>
1.1 解析
回顾开篇讲到的RSA的工作原理:
<li>1.生成私钥和公钥</li>
Demo中已经自动集成了已经生成好的公钥和私钥
<li>2.用公钥对原始数据进行加密,得到密文</li>
Demo中VKRSA类中封装了加密操作,外部调用即可
<li>3.用私钥对密文进行解密,得到原始数据</li>
Demo中VKRSA类中封装了解密操作,外部调用即可
1.2 密钥的生成
目前最通用生成RSA密钥的方式通过openssl工具来签发公钥和私钥。当然也有其他方式,比如自己写程序生成密钥对,java(Security包)、C++(openssl SDK)、OC(Security.framework)都有对应的函数接口。这里主要讲通过openssl工具来生成密钥对。
1.2.1 openssl签发密钥对顺序
当然,如果没有openssl的环境,需要安装一个,相信你肯定可以快速自行解决。密钥对步骤如下:
<li><h5>1.生成私钥文件</li>
terminal:openssl genrsa -out rsa_private_key.pem 1024
说明:“rsa_private_key.pem”为生成私钥pem文件名,”1024“是指私钥长度。
执行成功会在当前文件夹下生成rsa_private_key.pem的私钥文件
<li><h5>2.通过生成的私钥文件签发一个公钥文件</li>
terminal:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
说明:“rsa_private_key.pem”为第一步生成私钥文件,"rsa_public_key.pem"为导出的公钥文件
<li><h5>3.把生成的私钥文件转成pkcs8格式的pem文件</li>
terminal:openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem
注意:“ -out rsa_private_key_pkcs8.pem”必须加上,不然会把内容输出到terminal,而且内容还不同。具体原因未仔细查询,如有同学知道,请通知我,感谢!
整个流程如下图
如下图所示
1.2.2 密钥文件格式说明
<p>文件生成了之后,有的童鞋会问:
为什么这里的密钥文件是pem格式的,与其他格式文件的差异是什么?比如:cer文件、der文件、csr文件、key文件、p12文件
<p>针对这个问题,请查看<a href='http://www.jianshu.com/p/6927fe6f9813'>证书编码以及文件格式汇总</a>
未完...下次更新