1. RSA算法不是RSA公司发明的,RSA算法之所以叫“RSA”,是因为发明这个算法的三个人的名字首字母分别是“R”,“S”,“A”。那么RSA公司的名字怎么来的?我也不知道,这个要问RSA公司的创始人。
2. “算法”不过是“做某件事情的具体步骤”的简写而已,这个名词不是那么的高深莫测。
3. RSA算法是一个公开的算法,也就是说,任何人都可以去研究和了解,RSA算法本身不是秘密的。在一本普通的本科级别数论教科书中都很可能讲解RSA算法。
4. RSA算法简要说起来,可以看成是两个函数,分别是:
密文 = F(明文,C)
明文 = G(密文,P_1,P_2)
其中:F是加密函数,可以将明文变成密文;G是解密函数,可以将密文变成明文;另外,P_1和P_2是两个质数,C = P_1 * P_2。
RSA算法定义了函数F和G,但是对P_1,P_2没有任何规定,只要是两个质数就行。
5. RSA算法是这样使用的:
假设我希望收到别人的信息,那么我会先选两个质数P_1和P_2,计算出我自己的C,然后只对外发布我自己的C,想给我信息的人用函数F及我发布的C将他要给我的明文变成密文,我接收到他给我的密文后使用函数G配合只有我自己知道的P_1和P_2将密文转换回明文。
假设我希望给别人发送信息,那么我会用函数F配合对方发布的C将我要发送的明文变成密文,对方接收到密文后会调用函数G配合只有他自己知道的P_1,P_2将密文转换成明文。
所以,C统称为“公钥”,只用来加密,对外发布;P_1和P_2统称为“私钥”,只用于解密,绝对不对外发布。
6. RSA算法精妙的地方在于利用了一种数学现象:计算两个数相乘是很简单的事情,但是把一个合数进行质因数分解是一件很困难的事情。虽然P_1 * P_2 = C,但是通过公布的C,别人是几乎不可能找出对应的P_1和P_2的。
理解起来很简单:两个n位数相乘,列一下小学教过的乘法竖式,这不过是做n^2次的个位数乘法和n个数相加的加法。换句话说,知道P_1和P_2就很容易算出C。
但是,对一个n位数C进行质因数分解,唯一的方法就是用1到C/2之间的所有质数去除C,只有让你碰巧除出来是个整数你才能做出质因数分解。1到C/2之间有多少个自然数:C是一个n位数,C/2最小也是一个n-1位数,每一位都可以是0~9这10种情况之一,所以1到C/2之间差不多有10^(n-1)个数。换句话说,10^(n-1)个连续自然数中有多少质数你就要做多少次除法,再加上在10^(n-1)个数中找质数的时间。
因此,假设我找的P_1和P_2分别都是1000位,那么我只需要做1000000次个位数乘法就能计算出C,这差不多是个1000000位数。
但是!如果只知道C,我需要做(10^999999个连续自然数中质数个数)次的除法,再加上在10^999999个自然数中找质数的时间。
所以,哪怕是你现在在用的普通电脑,算P_1 * P_2得到C是一件很简单的事情,但是就算把全世界的计算机计算能力都合在一起想通过C找出来P_1和P_2,也是一件不可能完成的事情。(“不可能”指的是你算到宇宙寿命结束都算不完)
所以,RSA可以认为是到目前为止最安全的加密方式。
那么假设NSA作弊是真的,它是怎么做到的?
P_1和P_2的选择和相乘是通过某个程序做的(谁也不会人工去做那么长的枯燥的乘法),RSA公司制作这种程序,所以这个程序记录一下P_1和P_2并且给NSA就行了,这样NSA根本不会去苦逼的通过C算P_1和P_2,它一开始就知道答案了。
所以,NSA不是“在RSA算法中安置了后门”,它是在“RSA算法的一个实现中安置了后门”。你不用这个实现,那么就不会受到NSA的威胁。
所以,怎么才能保证个人或者组织的加密文件不会被NSA破解?你可以不用那个RSA公司的软件,自己写个P_1,P_2的选择、相乘程序,以及实现函数F和G的程序,这是一个软件专业本科生能够做到的事情。
另外,补充一点:通过C算P_1和P_2是一个NP问题,只能一个数一个数地去试,也就是暴力破解,但不是通过提升计算机速度就能暴力破解成功的:C的位数每多一位,你的计算量差不多就是之前的10倍。
计算机的速度能提升到什么程度?呵呵,什么程度都无所谓,因为在强大的
《真·最终奥义·数学神の护佑·指数增长》
面前,intel、AMD、nVidia之流不过是战斗力0.5的渣。
。
。
。
。
。
。
。
什么?!骚年,你还是想破解RSA?其实也可以的,去发明真正的量子计算机吧!
转载于:https://blog.51cto.com/tmpbook/1404524