密码学研究的是加密和解密。
- 加密就是把明文通过“加密算法”变成密文。
- 解密就是把密文通过“解密算法” 变成明文。
加密算法,我们可以认为就是在涉及一个算法,使得 明文变成别人看不懂的符号,同时自己有办法看得懂的算法。(从严格上来讲,只要只需要把明文变成别人看不到的符号就可以了,但这样没任何意义。)
解密,则是运用各种手段把别人的密文转变为明文。
解密有很多种手段,尽管我要讲的是“RSA算法”,但是为了更好的理解,RSA算法的设计初衷,有必要了解密的一些知识。
解密算法的手段可以分为:
- 如果无法获取“明文和密文”样本,同时无法获得加解密算法,直接通过密文,推测明文的意思。
比如 uoy evol i。这种破解方法依赖于我们的常识,运营常识破解,运用常识验证正确性。
- 如果可以获取“明文密文样本”,但是无法获取加解密算法,收集大量的密文和明文进行比对,分析出加密过程,然后得出解密的算法。
如:love ->【hashmap(x)= x + 2】 —>nqxg,我们可以通过分析明文密文样本得出hashmap(x)的算法。
- 如果可以获得“明文密文样本”,可以获得加解密算法,但是无法获取加解密算法所依赖的密钥。
这个只能通过分析加解密算法,以及明文密文样本,从而最少的暴力尝试,猜测去这个密钥了或者尝试去寻找这个算法的漏洞,绕过密钥验证。
比如:love ->【hashmap(x)= x^s + 2】 —>nqxg, s为密钥。
.
那么RSA怎么破解呢?
1.RSA的加密算法是公开的,所以加密算法和解密算法是已知的。
2.明文和密文通常是未知了,但是可以通过社工手段获取,所以可以认为是已知的。
3.加密钥匙和解密钥匙有其中一把是已知,另一把是未知的。
4.这个算法不存在漏洞,我们先假定他不存在漏洞,只是我不知他有什么漏洞,大部分人也不知道。
.所以,我们只能通过暴力手段在最少的尝试次数下去,去猜测密钥。哈哈,这几乎不可能猜得中。为什么呢?
因为RSA算法就是为了让你很难暴力猜中才设计的。
RSA算法被设计为:用最低的成本生成钥匙,却要用非常大的成本猜中密钥。
如果,你想要通过暴力去破解,就会进入RSA的陷阱了,所以破解RSA最有效的手段就是通过其他手段获取另一个密钥,比如社工手段。
RSA算法怎么设计呢?首先我们要将RSA的需求一个一个分析出来,然后在根据需求去迭代。就跟软件工程开发一样,满足最小可用性,一个需求一个需求地去迭代。
首选RSA要实现第一个需求:
将一个明文数变成一个密文数,密文数的不能大于n,需求的目的:加密后的密文不能太占用内存。
所以RSA算法为 RSA(x) = x mod n
第二个需求:
算法公开,n也是公开的,但是不能让别人解密,算法公开为了预防算法泄漏之后被别人破解了,所以我们干脆公开算法,但是不能让别人解密。
所以RSA算法为 RSA(x) = x^s mod n,s不能让别人知道。只要别人猜不中s的值,别人就无法知道破解了。
第三个需求:
通过密钥可以很容易解密,解密算法和加密算法一致。
若 RSA(x) = x^s mod n, 已知s,RSA(x),n,求X几乎不可能,太难了。
那么是否存在另一个数p,使得 x = RSA(x) ^p mod n 成立呢?如果存在,这个p是多少?
我们可以用反证法,证明这个数存在,
如果存在另一个数p,使得 x = RSA(x) ^p mod n 成立,
那么
x = (x^s mod n) ^p mod n
= (x^s) ^p mod n
= x ^(s*p) mod n ,
设N = s*p,如果存在一个数N,使得
x =x^N mod n 成立
那么p就存在。
x =x^N mod n。然后我们会思考有哪些公式定理和这个长得差不多呢?如果有这样的公式,是否能通过等式变化成【x =x^N mod n】呢?
确实有这样的公式定理,
那就是大名鼎鼎的【欧拉定理】
1 = x^φ(n) mod n
这里开始不白话了,有空再白话
欧拉定理可以转化为 x = x^ ( kφ(n) + 1 ) mod n
所以, N = kφ(n) + 1 ,那么p = N /s = ( kφ(n) + 1)/s
我们只需要 求出 φ(n) 然后通过调整k,因素分解出s,p ,是的s != p 就可以了, s,p分别是2个不相等的密钥。
整个RSA就这样诞生了