博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中RSA加密详解
阅读量:7120 次
发布时间:2019-06-28

本文共 1272 字,大约阅读时间需要 4 分钟。

先贴出代码的地址,做个说明,因为RSA加密在iOS的代码比较少,网上开源的也很少,最多的才8个星星。使用过程中发现有错误。然后我做了修正,和另一个库进行了整合,然后将其支持CocoaPod。

https://github.com/qianhongqiang/RSAEncryptor

RSA加密的原理就不拾人牙慧了,一搜一大堆。不过在这里还是要感叹下数学的魅力。

在这里对代码的一些细节进行一下分析,

- (NSData*) rsaEncryptData:(NSData*)data {    SecKeyRef key = [self getPublicKey];    size_t cipherBufferSize = SecKeyGetBlockSize(key);    uint8_t *cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t));    size_t blockSize = cipherBufferSize - 11;    size_t blockCount = (size_t)ceil([data length] / (double)blockSize);    NSMutableData *encryptedData = [[NSMutableData alloc] init] ;    for (int i=0; i

这里是加密的逻辑,根据RSA的原理,cipherBufferSize是秘钥长度/8,也就是秘钥的字节数,加密的长度不能超过秘钥的长度,所以加密需要分段。举个例子,你加密的长度是300个字节,你的秘钥是1024位(128字节)的,那么你需要分成3段去加密,前面两段是128,最后一段是44个字节。但是这个加密块大小不能直接这么设置,需要有一块用于填充加密信息的,RSA_PKCS1_PADDING,具体的可以参见这片博文

http://www.cnblogs.com/spencerN/archive/2012/10/18/2729602.html

所以无论你的秘钥长度是多少,都需要保留11个字节用于PKCS1填充。这也就是代码中出现了-11的原因。kSecPaddingPKCS1在这里会被用到

SecKeyEncrypt(key, kSecPaddingPKCS1, (const uint8_t *)[buffer bytes], [buffer length], cipherBuffer, &cipherBufferSize);分段加密出来的结果是秘钥的长度,会比加密前长出11个字节
分段加密的结果拼接后获得最终的加密结果。
解密也是一样的流程,不过不要设置RSA_PKCS1_PADDING,只需要按照秘钥的长度去获取,流程与加密几乎一致。在我最初的代码中,原作者没有分段揭秘,我修正了这个问题。

转载于:https://www.cnblogs.com/qianhongqiang/p/5346888.html

你可能感兴趣的文章
亚信基于AWS构建世界级企业互联网平台
查看>>
达索系统成立“大土木工程达索系统BIM技术推进联盟”深化应用、共享经验
查看>>
猥琐思路复现Spring WebFlow远程代码执行
查看>>
开发平台怎么选?来看看专业人士怎么说
查看>>
移动设备尚未形成DDoS的3个原因
查看>>
《OpenGL编程指南(原书第9版)》——1.4 OpenGL渲染管线
查看>>
《中国人工智能学会通讯》——7.7 结束语
查看>>
勒索软件好多都使用恶意LNK链接文件欺骗用户 来看趋势科技分析新型LNK-PowerShell攻击...
查看>>
《数字逻辑设计与计算机组成》一 第2章 2.1 简介
查看>>
《并行计算的编程模型》一3.5 远程内存访问:put和get
查看>>
思博伦安全专家预测2017年民用和军用全球导航应用面临的更大风险
查看>>
勒索软件指向Flash与Silverlight漏洞
查看>>
人工智能项目正在起飞:这对未来的工作意味着什么?
查看>>
天时、地利、人和,技术成熟推动闪存联盟2.0落地
查看>>
五款可以取代 Slack 的开源工具
查看>>
如何将大数据变成企业的洞察力和行动力?
查看>>
新技术给数据中心带来新风险
查看>>
Spring核心框架体系结构
查看>>
换脸上阵的路由界新面孔,联想云路由动手玩
查看>>
浅谈浏览器缓存机制
查看>>