RSA算法
是最广为使用的“非对称加密算法
”,基本上只要有计算机网络的地方,就有RSA算法。 这种算法很是可靠,密钥越长,它就越难破解。根据报道,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还没法破解(至少没人公开宣布)。 所以能够认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。RSA是由Rivest、Shamir 和 Adleman三位数学家1977年提出的加密算法,因此以他们首字母命名。html
理解RSA
首先要理解非对称加密
:git
公钥
和私钥
组成,公钥和私钥是按照必定数学算法生成的。公钥是公开的,任何人均可以获取。私钥是保密的,只有拥有者才能使用。RSA加密在iOS
中常常用到,常见场景是加密用户输入的密码发送给后台,固然为了避免泄露用户密码,通常都是将密码进行MD5加盐编码后再用RSA加密给后台,这样即便被破解,也不会泄露用户输入的密码。github
App->>Server: App请求“公钥”
Server->> App: Server返回“公钥”
App->> Server: App用公钥加密“密码”发送
Server->> App: Server解密正确返回数据
复制代码
注意: 通常是后台从密钥池中选取一对公私钥,把公钥发送给客户端,客户端加密密码等机密信息后发送给后台,后台使用私钥解密获取加密的内容。算法
防反编译: 密码密钥等信息通常不存在客户端,防止被反编译。数据库
耗时操做: 生成公私钥是耗时操做,后台通常会提早生成多对公私钥保存到数据库中,使用的时候随机取出一对,使用并记录使用的那一对便可。安全
文件格式: 后台生成.der和.p12后缀格式的文件,其中der格式的文件存放的是公钥(Public key)用于加密,p12格式的文件存放的是私钥(Private key)用于解密。后台能够从.der文件中读出公钥,转化为JSON字符串格式发送给客户端,也能够直接发送后缀名为.der格式公钥文件,客户端下载后使用。服务器
iOS生成公私钥对: 至于iOS端生成RSA公私钥,须要集成openssl库,具体Google百度吧。网络
加解密失败: 若是与后台联调的时候加解密失败,注意一下密钥格式(分为pkcs8和pkcs1)。例如Mac下生成的给iOS使用公私钥文件.der和.p12,密钥编码格式为pkcs1;而Java后台使用的.pem文件格式的公私钥,编码格式为pkcs8,使用的时候须要转换格式。函数
Wiki百科: 对极大整数作因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数作因数分解愈困难,RSA算法愈可靠。编码
假若有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度降低。但找到这样的算法的可能性是很是小的。今天只有短的RSA密钥才可能被暴力破解。到目前为止,世界上尚未任何可靠的攻击RSA算法的方式。
只要密钥长度足够长,用RSA加密的信息其实是不能被解破的。
PS:假设m为要传递的密文,mod为求余,N、e、d都是已知的
若是要加密大于N的数据怎么办? 有两种解决方法:
用户密码/交易密码
发送给服务器客户端向服务器请求
RSA公钥
→服务器
→ 返给客户端一个NSString
格式的RSA公钥 → 客户端用RSA公钥字符串
加密密码
发送给服务器 → 服务器用RSA私钥解密并核对密码
→ 核对密码是否正确,并返回客户数据给客户端
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTbZ6cNH9 PgdF60aQKveLz3FTalyzHQwbp601y77SzmGHX3F5NoVUZbd K7UMdoCLK4FBziTewYD9DWvAErXZo9BFuI96bAop8wfl1Vk ZyyHTcznxNJFGSQd/B70/ExMgMBpEwkAAdyUqIjIdVGh1FQ K/4acwS39YXwbS+IlHsPSQIDAQAB
但因为含有/+=\n
等特殊字符串,网络传输过程当中致使转义,进而致使加密解密不成功,解决办法是进行URL特殊符号编码解码(百分号转义);具体示例,在Demo中有示例,文章最下方有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加密封装类
//注意:若是使用,须要打开钥匙串;由于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 ⭐️,您的鼓励是我前进的动力