文章推荐之iOS逆向(1)-密码学(RSA)开端

文章首发:www.jianshu.com/p/4a920586a…算法

要讲逆向,那么确定少不了密码学,由于全部的逆向(攻防)都是对已加密的数据进行解密。因此咱们必须初步了解加密的方式有哪些,毕竟知己知彼,才能百战百胜。vim

接下来,我将从如下四方面来说述密码学相关的内容: 一、什么是密码学 二、RSA数学原理 三、RSA终端命令 四、总结安全

一、什么是密码学

密码学的历史大体能够追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的作法很简单,就是对二十几个罗马字母创建一张对应表。这样,若是不知道密码本,即便截获一段信息也看不懂。bash

从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学的发展很是的缓慢,由于设计者基本上靠经验。没有运用数学原理。微信

在1976年之前,全部的加密方法都是同一种模式:加密、解密使用同一种算法。在交互数据的时候,彼此通讯的双方就必须将规则告诉对方,不然无法解密。那么加密和解密的规则(简称密钥),它保护就显得尤为重 要。传递密钥就成为了最大的隐患。这种加密方式被成为对称加密算法(symmetric encryption algorithm)。函数

1976年,两位美国计算机学家 迪菲(W.Diffie)、赫尔曼( M.Hellman ) 提出了一种崭新构思,能够在不直接传递密钥的状况下,完成密钥交换。这被称为“迪菲赫尔曼密钥交换”算法。开创了密码学研究的新方向。学习

1977年三位麻省理工学院的数学家 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一块儿设计了一种算法,能够实现非对称加密。这个算法用他们三我的的名字命名,叫作RSA算法。加密

也就是说「迪菲赫尔曼密钥交换」在密码学历史的车轮中成为了一个转折点。spa

二、RSA数学原理

我们这里先把全部须要用到的公式定理列出来: 一、取模运算 二、欧拉函数φ 三、欧拉定理,费马小定理 四、模反元素 五、迪菲赫尔曼密钥交换设计

一、取模运算

取模运算(“Modulo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不彻底一致。主要的区别在于对负整数进行除法运算时操做不一样。 在这列出各类负数状况的例子供你们理解: 7 mod 4 = 3(商 = 1 或 2,1<2,取商=1) -7 mod 4 = 1(商 = -1 或 -2,-2<-1,取商=-2) 7 mod -4 = -1(商 = -1或-2,-2<-1,取商=-2) -7 mod -4 = -3(商 = 1或2,1<2,取商=1)

函数值符号规律(余数的符号) mod(负,正)=正 mod(正,负)=负 结论:两个整数求余时,其值的符号为除数的符号。

二、欧拉函数φ(读fai,三声)

能够简单理解为: 若是n能够分解为**两个互质(不必定是两个质数)**的数之积A和B,那么: φ(n) = φ(A) * φ(B) 若是 A和B 又同时为质数,那么: φ(n) = (A-1) * (B-1)

三、欧拉定理,费马小定理

首先这里说一下,定制之因此是定理是被人证实过的,如何证实的无论,固然你也能够增长去证实下,反正我无论(……&%¥%……&%&……&%),哈哈

若是m、n为正整数,且m、n互质,那么:

image

若是n为质数,那么:

image

公式转换:

image

四、模反元素

若是两个正整数e和x互质,那么必定能够找到整数d,使得 e*d-1 被x整除。那么d就是e对于x的“模反元素”。

image

五、迪菲赫尔曼密钥交换

image

如上图: 客户端持有一个随机数13 ,服务端持有随机数15,再选一对特殊的数,3是17的原根(啥是原根?)。 两端交换的都是密文,就算中间被劫持,也不知道最后须要的传输的内容是10 那么这个10就是最后真正的秘钥。

证实过程

==> 3^(13 * 15) mod 17 = 3^(13 * 15) mod 17 
根据模幂运算 ((m^e mod n)^d) mod n = m^(e*d) mod n
==>  (3^13 mod 17)^13 mod 17 = (3^15 mod 17)^15 mod 17
因为   3^13 mod 17 = 12      
          3^15 mod 17 = 6
==>  6^13 mod 17 =  12^15 mod 17 = 10

复制代码

m=3  ,e=13  ,d=15  ,n=17  ,C=12

复制代码

那么:

m^e mod n = c
 c^d mod n = (m^e mod n)^d mod n = m^(e*d) mod n

复制代码

又因为上面模反元素 最后得出

m^(e*d) mod n = m

复制代码

因此得出最终结论:

m^e mod n = c
c^d  mod n = m

复制代码

这个公式也就是咱们最后的RSA加密公式!!! 其中:

公钥: n和e 
私钥: n和d
明文:    m
密文:    c
d是e对于φ(n)的“模反元素”。

复制代码

补充: 一、n会很是大,长度通常为1024个二进制位。(目前人类已经分解的最大整数,232个十进制位,768个二进制位) 二、因为须要求出φ(n),因此根据欧函数特色,最简单的方式n 由两个质数相乘获得: 质数:p一、p2 Φ(n) = (p1 -1) * (p2 - 1) 三、最终由φ(n)获得e 和 d 。 总共生成6个数字:p一、p二、n、φ(n)、e、d

关于RSA的安全: 除了公钥用到了n和e 其他的4个数字是不公开的。 目前破解RSA获得d的方式以下: 一、要想求出私钥 d 。因为e*d = φ(n)k + 1。要知道e和φ(n); 二、e是知道的,可是要获得 φ(n),必须知道p1 和 p2。 三、因为 n=p1p2。只有将n因数分解才能算出。

三、RSA终端命令

因为Mac系统内置OpenSSL(开源加密库),因此咱们能够直接在终端上使用命令来玩RSA. OpenSSL中RSA算法经常使用指令主要有三个:

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

一、生成RSA私钥,密钥长度为1024bit

// 生成RSA私钥,密钥长度为1024bit
openssl genrsa -out private.pem 1024

复制代码

image

二、从私钥中提取公钥

// 从私钥中提取公钥
openssl rsa -in private.pem -pubout -out public.pem

复制代码

image

三、将私钥转换成为明文

// 将私钥转换成为明文
openssl rsa -in private.pem -text -out private.txt
cat private.txt

复制代码

image

四、经过公钥加密数据,私钥解密数据

// 新建一个文件,在文件中随意输入内容,好比输入字符串”Hello“
vim message.txt  
// 查看文件
cat message.txt  
// 经过公钥进行加密
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
// 经过私钥进行解密
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
// 查看加密后的文件
cat enc.txt  
// 查看解密后的文件
cat dec.txt  

复制代码

image

五、经过私钥加密数据,公钥解密数据

// 私钥加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enc_2.txt
// 公钥加密
openssl rsautl -verify -in enc_2.txt -inkey public.pem -pubin -out dec_2.txt

复制代码

image

四、总结:

一、因为RSA加密解密用的不是一套数据,因此其保证了安全性。

二、因为私钥过大,因此效率较低

三、若是有一天量子计算机被普及(计算速度极快),那么1024位已经不足以让RSA安全。

此文转载于简书

做者:一缕清风扬万里

原文地址

其实呢做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是个人微信 你们有兴趣能够添加 邀请兄弟们进入微信群里一块儿 交流

相关文章
相关标签/搜索