iOS之逆向开发iOS之功能细节iOS之基础知识

iOS端RSA加密

2017-07-05  本文已影响186人  CocoFei

RSA算法是最广为使用的“非对称加密算法”,基本上只要有计算机网络的地方,就有RSA算法。
这种算法非常可靠,密钥越长,它就越难破解。根据报道,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。 因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。RSA是由Rivest、Shamir 和 Adleman三位数学家1977年提出的加密算法,所以以他们首字母命名。

理解RSA

理解RSA首先要理解非对称加密:

iOS使用RSA

RSA加密iOS中经常用到,常见场景是加密用户输入的密码发送给后台,当然为了不泄露用户密码,一般都是将密码进行MD5加盐编码后再用RSA加密给后台,这样即使被破解,也不会泄露用户输入的密码。

基本流程

App->>Server: App请求“公钥”
Server->> App: Server返回“公钥”
App->> Server: App用公钥加密“密码”发送
Server->> App: Server解密正确返回数据

注意: 一般是后台从密钥池中选取一对公私钥,把公钥发送给客户端,客户端加密密码等机密信息后发送给后台,后台使用私钥解密获取加密的内容。

iOS使用RSA注意点

RSA可靠性

Wiki百科: 对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。

假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。

只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。

RSA公私钥生成步骤:

  1. 随意选择两个大的质数p和q,p不等于q,计算N=pq,N的二进制位数就是密钥长度。
  2. 根据欧拉函数(对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目),求得r = (p-1)(q-1)
  3. 选择一个小于r的整数e,条件是1< e < r,且e与r互质,求得 e 关于模 r 的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)
  4. 将 p 和 q 的记录销毁。
  5. (N,e)是公钥,(N,d)是私钥。

RSA加解密公式

PS:假设m为要传递的密文,mod为求余,N、e、d都是已知的

RSA加密长度限制:

RSA加密长度超限制解决办法:

如果要加密大于N的数据怎么办? 有两种解决方法:

iOS端RSA加解密示例

场景:客户端加密用户密码/交易密码发送给服务器

客户端向服务器请求RSA公钥服务器 → 返给客户端一个NSString格式的RSA公钥 → 客户端用RSA公钥字符串加密密码发送给服务器 → 服务器用RSA私钥解密并核对密码 → 核对密码是否正确,并返回客户数据给客户端

RSA序列图

例如:这是一串服务器生成的RSA公钥

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTbZ6cNH9
PgdF60aQKveLz3FTalyzHQwbp601y77SzmGHX3F5NoVUZbd
K7UMdoCLK4FBziTewYD9DWvAErXZo9BFuI96bAop8wfl1Vk
ZyyHTcznxNJFGSQd/B70/ExMgMBpEwkAAdyUqIjIdVGh1FQ
K/4acwS39YXwbS+IlHsPSQIDAQAB

但由于含有/+=\n等特殊字符串,网络传输过程中导致转义,进而导致加密解密不成功,解决办法是进行URL特殊符号编码解码(百分号转义);具体示例,在Demo中有示例,文章最下方有Demo链接

RSA用NSString加密解密Demo,非常简单

//----------------------RSA加密示例------------------------
//原始数据,要加密的字符串
NSString *originalString = @"这是一段将要使用'秘钥字符串'进行加密的字符串!";

//使用字符串格式的公钥私钥加密解密, RSAPublickKey为公钥字符串(NSString格式)
NSString *encryptStr = [RSAEncryptor encryptString:originalString publicKey:RSAPublickKey];

NSLog(@"加密前:%@", originalString);
NSLog(@"加密后:%@", encryptStr);
//用私钥解密,RSAPrivateKey为私钥字符串(NSString格式)
NSString *decryptString = [RSAEncryptor decryptString:encryptStr privateKey:RSAPrivateKey];

NSLog(@"解密后:%@",decryptString);

RSA用NSString加解密的示例头文件

// RSA加密封装类
//注意:如果使用,需要打开钥匙串;因为iOS不支持直接使用字符串格式的公钥进行加密,转换为文件后可使用

#import <Foundation/Foundation.h>

@interface RSAEncryptor : NSObject

/**
 *  加密方法
 *
 *  @param str   需要加密的字符串
 *  @param path  '.der'格式的公钥文件路径
 */
+ (NSString *)encryptString:(NSString *)str publicKeyWithContentsOfFile:(NSString *)path;

/**
 *  解密方法
 *
 *  @param str       需要解密的字符串
 *  @param path      '.p12'格式的私钥文件路径
 *  @param password  私钥文件密码
 */
+ (NSString *)decryptString:(NSString *)str privateKeyWithContentsOfFile:(NSString *)path password:(NSString *)password;

/**
 *  加密方法
 *
 *  @param str    需要加密的字符串
 *  @param pubKey 公钥字符串
 */
+ (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey;

/**
 *  解密方法
 *
 *  @param str     需要解密的字符串
 *  @param privKey 私钥字符串
 */
+ (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey;

@end

如果您觉得有所帮助,请在RSADemo上赏个Star ⭐️,您的鼓励是我前进的动力

参考:

上一篇下一篇

猜你喜欢

热点阅读