iOS 逆向开发08:RSA加密

iOS 逆向开发 文章汇总

目录

  • 一、RSA终端操作演示
  • 二、RSA代码加解密
    • RSA用途
  • 三、密码学
  • 四、RSA数学原理
  • 五、RSA原理总结


一、RSA终端操作演示

Mac的终端可以直接使用OpenSSL进行RSA的命令运行。

OpenSSL使用RSA

由于Mac系统内置OpenSSL(开源加密库),所以我们可以直接在终端上使用命令来玩RSA. OpenSSL中RSA算法常用指令主要有三个:

命令 含义
genrsa 生成并输入一个RSA私钥
rsautl 使用RSA密钥进行加密、解密、签名和验证等运算
rsa 处理RSA密钥的格式转换等问题


  1. 生成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)
  1. 从私钥中提取公钥
ztkj  ~/Desktop/RSA : openssl rsa -in private.pem -pubout -out public.pem
  1. 生成的文件如下
  1. 将私钥转换成为明文
// 转为明文信息
ztkj  ~/Desktop/RSA : openssl rsa -in private.pem -text -out private.txt

// 查看文本信息
ztkj  ~/Desktop/RSA : cat private.txt
  1. 通过公钥加密数据,私钥解密数据
// 生成明文文件
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
  1. 通过私钥加密数据,公钥解密数据
// 通过私钥加密
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文件进行加解密,因此需要生成p12der文件

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一般用于客服端(公钥)和服务端(私钥)传递关键数据。

  1. 传递对称加密的Key
  2. 数字签名



.
.
.
以下选读
.
.
.


三、密码学

密码学是指研究信息加密,破解密码的技术科学。密码学的起源可追溯到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)的模反元素

你可能感兴趣的:(iOS 逆向开发08:RSA加密)