iOS开发教程-iOS中的RSA加解密

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

北京千锋互联科技有限公司版权所有iOS开发教程-iOS中的RSA加解密在移动应用开发中常常遇到数据传输安全性的问题,尤其是在账户安全以及支付场景中的订单数据、或支付信息的传输中,正规的公司一定会要求对数据进行加密,当然有创业初期的公司会在前期产品中让所有数据进行“裸奔”,不过在产品成型以后,一定会要求对数据进行加密的。那么,接下来就简单说说iOS中最常见的RSA加密吧。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA采用公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在实际工作中的加密密钥都是对多个加密端公开的,保证其安全性的主要任务是解密密钥的保密工作。1.iOS中RSA加解密的密钥创建首先要使用RSA加密,首先是生成RSA的加密密钥和解密密钥,RSA是非对称加密方式,在实际应用中,通常把用来加密的密钥称为公钥,如在iOS端、Android、WindowsPhone应用中加密数据使用的密钥,解密密钥称为私钥,一般把解密密钥存放在移动应用的服务器端。这种做法主要是考虑到心怀恶意的攻击者很容易获取移动端应用,进行反编译获取加密密钥,而攻击者想要获取服务器端的私钥(除非服务器端团队成员恶意泄露),否则基本上不可能,而获取到RSA的加密密钥,只要密钥的位数足够长,几乎不可能推导出解密密钥,所以攻击者拿到加密密钥完全没有用。在不同环境中有不同的创建RSA加密密钥和解密密钥的方法,下面提供一个在Mac系统中使用终端创建的具体步骤:生成私钥文件$opensslgenrsa-outprivate.pem2048◦openssl:是一个自由的软件组织,专注做加密和解密的框架。北京千锋互联科技有限公司版权所有genrsa:指定了生成了算法使用RSA-out:后面的参数表示生成的key的输入文件2048:表示的是生成key的长度,单位字节(bits)创建证书请求$opensslreq-new-keyprivate.pem-outrsacert.csr可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。(要收费的)生成证书并签名,有效期10年$opensslx509-req-days3650-inrsacert.csr-signkeyprivate.pem-outrsacert.crt509是一种非常通用的证书格式。将用上面生成的密钥privkey.pem和rsacert.csr证书请求文件生成一个数字证书rsacert.crt。这个就是公钥转换格式将PEM格式文件转换成DER格式$opensslx509-outformder-inrsacert.crt-outrsacert.der在iOS开发中,公钥是不能使用base64编码的,上面的命令是将公钥的base64编码字符串转换成二进制数据导出P12文件在iOS使用私钥不能直接使用,需要导出一个p12文件。下面命令就是将私钥文件导出为p12文件。$opensslpkcs12-export-outp.p12-inkeyprivate.pem-inrsacert.crt有了公钥和私钥之后,接下来的就是代码了,在这我粘贴出重要部分的代码,如果想要具体的Demo2.加解密的方法声明加密方法+(NSString*)RSAEncrypt:(NSString*)plainTextString;/**************************************************************************函数名称:+(NSData*)RSADecryptWithPrivateKey:(NSData*)cipherData函数描述:用私钥对已经进行RSA加密的数据进行解密输入参数:(NSData*)data输出参数:N/A返回参数:(NSData*)北京千锋互联科技有限公司版权所有备注信息:******************************************************************************/解密方法/**************************************************************************函数名称:+(NSString*)RSADecryptString:(NSString*)rsaString函数描述:用私钥对已经进行RSA加密的字符串进行解密输入参数:(NSString*)rsaString输出参数:N/A返回参数:(NSString*)备注信息:**************************************************************************/+(NSString*)RSADecryptString:(NSString*)rsaString;3.加解密方法的具体实现加密方法实现+(NSString*)RSAEncrypt:(NSString*)plainTextString{if(!plainTextString||[plainTextStringisEqualToString:@null]){returnnil;}size_tcipherBufferSize=SecKeyGetBlockSize([selfgetPublicKey]);uint8_t*cipherBuffer=malloc(cipherBufferSize);uint8_t*nonce=(uint8_t*)[plainTextStringUTF8String];SecKeyEncrypt([selfgetPublicKey],kSecPaddingNone,nonce,strlen((char*)nonce),&cipherBuffer[0],&cipherBufferSize);NSData*encryptedData=[NSDatadataWithBytes:cipherBufferlength:cipherBufferSize];//将加密后的数据进行Base64编码并转化为NSStringreturn[encryptedDatabase64EncodedString];}北京千锋互联科技有限公司版权所有4.解密方法实现+(NSString*)RSADecryptString:(NSString*)rsaString{//将已经进行base64编码的字符串解码成普通的NSDataNSData*cipherData=[rsaStringbase64DecodedData];NSData*plainData=[QFRSAToolRSADecryptWithPrivateKey:cipherData];return[[NSStringalloc]initWithData:plainDataencoding:NSUTF8StringEncoding];}+(NSData*)RSADecryptWithPrivateKey:(NSData*)cipherData{//分配内存块,用于存放解密后的数据段size_tplainBufferSize=SecKeyGetBlockSize([QFRSAToolgetPrivateKey]);NSLog(@plainBufferSize=%zd,plainBufferSize);uint8_t*plainBuffer=malloc(plainBufferSize*sizeof(uint8_t));//计算数据段最大长度及数据段的个数doubletotalLength=[cipherDatalength];size_tblockSize=plainBufferSize;size_tblockCount=(size_t)ceil(totalLength/blockSize);NSMutableData*decryptedData=[NSMutableDatadata];//分段解密for(inti=0;iblockCount;i++){NSUIntegerloc=i*blockSize;//数据段的实际大小。最后一段可能比blockSize小。intdataSegmentRealSize=MIN(blockSize,totalLength-loc);//截取需要解密的数据段NSData*dataSegment=[cipherDatasubdataWithRange:NSMakeRange(loc,dataSegmentRealSize)];OSStatusstatus=SecKeyDecrypt([QFRSAToolgetPrivateKey],kSecPaddingNone,(constuint8_t*)[dataSegmentbytes],dataSegmentRealSize,plainBuffer,&plainBufferSize);if(status==errSecSuccess){NSData*decryptedDataSegment=[[NSDataalloc]initWithBytes:(constvoid*)plainBufferlength:plainBufferSize];[decryptedDataappendData:decryptedDataSegment];北京千锋互联科技有限公司版权所有}else{if(plainBuffer){free(plainBuffer);}returnnil;}}if(plainBuffer){free(plainBuffer);}returndecryptedData;}5.RSA的优点安全性高,难于破解6.RSA加密的缺点1)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。2)安全性,RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价,而且密码学界多数人士倾向于因子分解不是NP问题。现今,人们已能分解140多个十进制位的大素数,这就要求使用更长的密钥,速度更慢;另外,人们正在积极寻找攻击RSA的方法,如选择密文攻击,一般攻击者是将某一信息作一下伪装(Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:(XM)d=Xd*Mdmodn前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-WayHashFunction对文档作HASH处理,或同时使用不同的签名算法。除了利用公共模数,人们还尝试一些利用解密指数或φ(n)等等攻击.3)速度太慢,由于RSA的分组长度太大,为保证安全性,n至少也要600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数北京千锋互联科技有限公司版权所有分解技术的发展,这个长度还在增加,不利于数据格式的标准化。SET(SecureElectronicTransaction)协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功