iOS 逆向开发 文章汇总
目录
- 一、RSA终端操作演示
- 二、RSA代码加解密
- RSA用途
- 三、密码学
- 四、RSA数学原理
- 五、RSA原理总结
一、RSA终端操作演示
Mac的终端可以直接使用OpenSSL进行RSA的命令运行。
OpenSSL使用RSA
由于Mac系统内置OpenSSL(开源加密库),所以我们可以直接在终端上使用命令来玩RSA. OpenSSL中RSA算法常用指令主要有三个:
命令 | 含义 |
---|---|
genrsa | 生成并输入一个RSA私钥 |
rsautl | 使用RSA密钥进行加密、解密、签名和验证等运算 |
rsa | 处理RSA密钥的格式转换等问题 |
- 生成RSA私钥,密钥长度为1024bit
ztkj ~ : cd /Users/ztkj/Desktop/RSA
ztkj ~/Desktop/RSA : openssl genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
.....++++++
................++++++
e is 65537 (0x10001)
- 从私钥中提取公钥
ztkj ~/Desktop/RSA : openssl rsa -in private.pem -pubout -out public.pem
- 生成的文件如下
- 将私钥转换成为明文
// 转为明文信息
ztkj ~/Desktop/RSA : openssl rsa -in private.pem -text -out private.txt
// 查看文本信息
ztkj ~/Desktop/RSA : cat private.txt
- 通过公钥加密数据,私钥解密数据
// 生成明文文件
ztkj ~/Desktop/RSA : vi message.txt
// 查看文本内容
ztkj ~/Desktop/RSA : cat message.txt
加密内容(密码:123456)
// 通过公钥加密
ztkj ~/Desktop/RSA : openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
// 通过私钥解密
ztkj ~/Desktop/RSA : openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
- 通过私钥加密数据,公钥解密数据
// 通过私钥加密
ztkj ~/Desktop/RSA : openssl rsautl -sign -in message.txt -inkey private.pem -out enc2.txt
// 通过公钥解密
ztkj ~/Desktop/RSA : openssl rsautl -verify -in enc2.txt -inkey public.pem -pubin -out dec2.txt
二、RSA代码加解密
由于iOS不能直接使用pem文件进行加解密,因此需要生成p12
和der
文件
ztkj ~ : cd /Users/ztkj/Desktop/RSA
// 申请请求文件
ztkj ~/Desktop/RSA : openssl req -new -key private.pem -out rsacert.csr
// 获取crt证书
ztkj ~/Desktop/RSA : openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
// 将crt证书转为der文件
ztkj ~/Desktop/RSA : openssl x509 -outform der -in rsacert.crt -out rsacert.der
// 通过crt证书生成p12文件
ztkj ~/Desktop/RSA : openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
// !!!: - 将p12和der替换为自己生成的文件
//1.加载公钥
[[RSACryptor sharedRSACryptor] loadPublicKey:[[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil]];
//2.加载私钥
[[RSACryptor sharedRSACryptor] loadPrivateKey:[[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil] password:@"123456"];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//加密
NSData *result = [[RSACryptor sharedRSACryptor] encryptData:[@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
NSString *base64 = [result base64EncodedStringWithOptions:0];
NSLog(@"加密:%@",base64);
//解密
NSData *jiemi = [[RSACryptor sharedRSACryptor] decryptData:result];
NSLog(@"解密:%@",[[NSString alloc] initWithData:jiemi encoding:NSUTF8StringEncoding]);
}
加密:xIGcDQwXk40tqcZVdpOFyFp2odbyUtk3s2h0ysVZG2QlKTRzmNh5OAaauc8mM+ZbPayu0L5BcAQnx+jvLQaxbxl1sJpbQjwQKqHYm2/HeP/giSK/nsdWs4prO9GTQ4A8gnT6hdAXfBsA/fzMZpxOhka8a4U8lXdoVcfO9ftFBBU=
解密:hello
Demo地址
RSA加密填充模式:kSecPaddingPKCS1 // 随机填充! 密文每次都不同
//kSecPaddingNone 不填充! 密文每次都不会变化.
RSA用途
RSA一般用于客服端(公钥)和服务端(私钥)传递关键数据。
- 传递对称加密的Key
- 数字签名
.
.
.
以下选读
.
.
.
三、密码学
密码学是指研究信息加密,破解密码的技术科学。密码学的起源可追溯到2000年前。而当今的密码学是以数学为基础的。
发展历史
密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表。这样,如果不知道密码本,即使截获一段信息也看不懂。
从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学的发展非常的缓慢,因为设计者基本上靠经验。没有运用数学原理。
- 在1976年以前,所有的加密方法都是同一种模式:
加密、解密
使用同一种算法
。在交互数据的时候,彼此通信的双方就必须将规则告诉对方,否则没法解密。那么加密和解密的规则(简称密钥
),它保护就显得尤其重要。传递密钥就成为了最大的隐患。这种加密方式被成为对称加密算法
(symmetric encryption algorithm) - 1976年,两位美国计算机学家
迪菲
(W.Diffie)、赫尔曼
( M.Hellman ) 提出了一种崭新构思,可以在不直接传递密钥的情况下,完成密钥交换。这被称为“迪菲赫尔曼密钥交换”
算法。开创了密码学研究的新方向
- 1977年三位麻省理工学院的数学家 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起设计了一种算法,可以实现非对称加密。这个算法用他们三个人的名字命名,叫做RSA算法。
四、RSA数学原理
上世纪70年代产生的一种加密算法。其加密方式比较特殊,需要两个密钥:公开密钥简称公钥(publickey)和私有密钥简称私钥(privatekey)。公钥加密,私钥解密;私钥加密,公钥解密。这个加密算法就是伟大的RSA
4.1离散对数问题
4.2欧拉函数φ
4.3欧拉定理
4.4公式转换
4.5迪菲赫尔曼密钥交换
4.6RSA的诞生
4.7RSA算法
五、RSA原理总结
- 加密算法,都是数学知识!
- 对称加密(传统加密算法)
- RSA (三个人的名字)非对称加密!(现代加密算法)
- 原根
- 欧拉函数、欧拉定理(费马小定理)
- 模反元素
- m ^(e * d)mod n ≡ m
- 迪菲赫尔曼密钥交换
- RSA算法
- RSA:拆解两个(大)质数的乘积很难!所以RSA相对安全!!
- 加密:M ^ e % N = C
- 解密:C ^ d % N = M
- 密文:C 明文: M
- 公钥:N 和 E
- 私钥:N 和 D
- 条件(总共有6个数字!):
- N 是由两个很大的质数(P1、P2)相乘得到!为了方便求出φ(N)。
- D 是 E (65537) 相对于φ(N)的模反元素