要讲逆向,那么肯定少不了密码学,数据加密、代码签名等都需要用到密码学。所以我们必须初步了解加密的方式有哪些,毕竟知己知彼,才能百战百胜。
接下来,我将从以下四方面来讲述密码学相关的内容:
1、密码学
2、RSA数学原理
3、RSA终端命令
4、RSA代码演示
1.逆向基础
1.什么是密码学?
密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表。这样,如果不知道密码本,即使截获一段信息也看不懂。
从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学的发展非常的缓慢,因为设计者基本上靠经验。没有运用数学原理。
在1976年以前,所有的加密方法都是同一种模式:加密、解密使用同一种算法。在交互数据的时候,彼此通信的双方就必须将规则告诉对方,否则没法解密。那么加密和解密的规则(简称密钥),它保护就显得尤其重
要。传递密钥就成为了最大的隐患。这种加密方式被成为对称加密算法(symmetric encryption algorithm)。
1976年,两位美国计算机学家 迪菲(W.Diffie)、赫尔曼( M.Hellman ) 提出了一种崭新构思,可以在不直接传递密钥的情况下,完成密钥交换。这被称为“迪菲赫尔曼密钥交换”算法。开创了密码学研究的新方向。
1977年三位麻省理工学院的数学家 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起设计了一种算法,可以实现非对称加密。这个算法用他们三个人的名字命名,叫做RSA算法。
也就是说「迪菲赫尔曼密钥交换」在密码学历史的车轮中成为了一个转折点。
2、RSA数学原理
需要用到的数学公式:
1、取模运算
2、欧拉函数φ
3、欧拉定理,费马小定理
4、模反元素
5、迪菲赫尔曼密钥交换
2.1、取模运算
取模运算(“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(正,负)=负
结论:两个整数求余时,其值的符号为除数的符号。
2.2、欧拉函数φ(读fai,三声)
可以简单理解为:
如果n可以分解为两个互质(不一定是两个质数)的数之积A和B,那么:
φ(n) = φ(A) * φ(B)
如果 A和B 又同时为质数,那么:
φ(n) = (A-1) * (B-1)
2.3、欧拉定理,费马小定理
首先这里说一下,定制之所以是定理是被人证明过的
欧拉定理: 如果两个正整数m和n互质,那么m的φ(n)次方减去1,可以被n整除。
公式表示为:
费马小定理:欧拉定理的特殊情况:如果两个正整数m和n互质,而且n为质数!那么φ(n)结果就是n-1。
公式表示为:
2.4、模反元素
概念:如果两个正整数e和x互质,那么一定可以找到整数d,使得 ed-1 被x整除,那么d就是e对于x的“模反元素”
2.5、迪菲赫尔曼密钥交换
如上图:
客户端持有一个随机数13 ,服务端持有随机数15,再选一对特殊的数,3是17的原根(啥是原根?)。
两端交换的都是密文,就算中间被劫持,也不知道最后需要的传输的内容是10
那么这个10就是最后真正的秘钥。
如图:
证明过程:
1 | 3^(13 * 15) mod 17 = 3^(13 * 15) mod 17 |
---|---|
2 | 根据模幂运算 ((m^e mod n)^d) mod n = m^(e*d) mod n |
3 | (3^13 mod 17)^13 mod 17 = (3^15 mod 17)^15 mod 17 |
4 | 由于 3^13 mod 17 = 12 , 3^15 mod 17 = 6 |
5 | 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
2.6、RSA算法
说明:
公钥: n和e
私钥: n和d
明文: m
密文: c
d是e对于φ(n)的“模反元素”。
补充说明:
- n会非常大,长度一般为1024个二进制位。(目前人类已经分解的最大整数,232个十进制位,768个二进制位)
- 由于需要求出φ(n),所以根据欧函数特点,最简单的方式n 由两个质数相乘得到: 质数:p1、p2
Φ(n) = (p1 -1) * (p2 - 1) - 最终由φ(n)得到e 和 d 。
总共生成6个数字:p1、p2、n、φ(n)、e、d
关于RSA的安全:
除了公钥用到了n和e 其余的4个数字是不公开的。
目前破解RSA得到d的方式如下:
1、要想求出私钥 d 。由于ed = φ(n)k + 1。要知道e和φ(n);
2、e是知道的,但是要得到 φ(n),必须知道p1 和 p2。
3、由于 n=p1*p2。只有将n因数分解才能算出。
3、RSA终端命令 (Mac的终端可以直接使用OpenSSL进行RSA的命令运行.)
3.1 OpenSSL 使用RSA
由于Mac系统内置OpenSSL(开源加密库),所以我们可以直接在终端上使用命令来玩RSA. OpenSSL中RSA算法常用指令主要有三个:
命令 | 含义 |
---|---|
genrsa | 生成并输入一个RSA私钥 |
rsautl | 使用RSA蜜钥进行加密、解密、签名和验证等运算 |
rsa | 处理RSA密钥的格式转换等问题 |
3.2 OpenSSL 使用RSA 终端命令详解
3.2.1 生成RSA私钥,密钥长度为1024bit
openssl genrsa -out private.pem 1024
3.2.2 从私钥中提取公钥
openssl rsa -in private.pem -pubout -out public.pem
3.2.3 此时生成的文件是两个,如下:
3.2.4 将私钥转换成为明文
- openssl rsa -in private.pem -text -out private.txt
-
cat private.txt
3.2.5 通过公钥加密数据,私钥解密数据
1. 新建一个文件,在文件中随意输入内容,比如输入字符串”Hello“
2. vim message.txt
3. 查看文件
4. cat message.txt
5. 通过公钥进行加密
6. openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
7. 通过私钥进行解密
8. openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
9. 查看加密后的文件
10. cat enc.txt
11. 查看解密后的文件
12. cat dec.txt
3.2.6 通过私钥加密数据,公钥解密数据
私钥加密
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
3.3 总结
1、由于RSA加密解密用的不是一套数据,所以其保证了安全性。
2、由于私钥过大,所以效率较低
3、如果有一天量子计算机被普及(计算速度极快),那么1024位已经不足以让RSA安全。
4 代码演示
图片编码,解码
base64 xxx.jpeg -o abc.txt
base64 abc.txt -o 123.png -D
4.1 Base64 介绍
Base64 介绍
字母构成
A-Z
a-z
0-9
/ + = (=号比较特殊)
24位,末位补0,0 转 成 =
所以base64 一共有 65 个字符
4.2 Base64 特点
1. 对一个二进制数据进行编码,文件会变大! 原有文件的4/3 , 多了1/3
2. 不便于查看的二进制数据,用base64进行表示。
4.3 RSA 准备 工作
4.3.1 证书生成步骤
由 3.2.1
中我们得到了2个pem文件,在开发中我们是经常直接使用pem文件的,所以我们要通过以下步骤转换证书。
1. 从私钥中获取csr文件
openssl req -new -key private.pem -out rsacert.csr
2.需要填写:国家、省、城市、公司、部门、部门名称、邮箱、密码(可不写)
3.获取证书 (从csr文件中获取证书)
openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
4.提取 文件(文件中主要包含公钥+信息)
openssl x509 -outform der -in rsacert.crt -out rsacert.der
5.获取私钥(p.12)
openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
RSA特点:1、效率低 2、加密小数据
RSA运用:1、加密KEY 2、数字签名
不清楚的地方,欢迎留言评论
代码地址 base64 & RSA
参考文章: 一缕清风扬万里