网安萌新,大佬勿喷
最近睡我下铺的哥们要向隔壁班一个女生表白,
问我能不能用黑客技术帮他表示一下,
这我可就不困了!!!

正好我在预习RSA,能不能做个表白密码呢?说干就干!
Hello RSA
先熟悉一遍整个加密流程:
找出两个互不相等的大质数p和q;
求出模n=p*q;
由欧拉函数,可得ϕ(n)=(p−1)(q−1);
找出一个与ϕ(n)互质的整数e,要求1eϕ(n);
计算出e关于ϕ(n)的模反元素d——说白了,不就是求个逆元吗;
计算公钥
计算私钥,解密
打个比方,锁门要用钥匙(公钥),开门也要用钥匙(私钥),Public key 可以公开,对我的安全没有影响,但是 Private key则不能,同时,我不能只会锁门而不会开门,除非这个门我不想再用了,所以在设计公钥的同时,也要考虑到私钥的可行性。从哲学的角度来讲,阴阳相生也。
几个问题
1.为什么要确保ϕ(n)互质的整数e?
在我看来,有两个方面:
由欧拉定理可知,当且仅当二者互质时,存在逆元,也就是私钥d;
若不互质,两个不同的明文,经过同样的秘钥加密,可以得到相同的密文,从而无法破解明文;
总的来说,就是impossible to decrypt,not vulnerable.
2.为啥要求1eϕ(n)?
这就涉及到了群的问题,简单来说,某些问题只能在某种范围或者说某种情况下成立,例如椭圆曲线加密,就是建立在椭圆曲线上几何操作定义的有限素数群上的DLP问题,简称ECDLP(Elliptic Curve Discrete logarithm Problem),感兴趣的读者可以研究一下。
一个核心
RSA算法的核心就是One Way——即已知明文求模得出密文容易,反之则极为困难,尤其是在模n特别大的情况下,将模运算的单向性发挥的淋漓尽致。
密码学的本质就是解决计算复杂(不可行)的数学问题。
Security relies on the difficulty of factoring large composite numbers.
爱情密码
首先选择公钥e:1314(或521、520、147...一句话:越骚越好!)
然后选择p和q,要求
1.ϕ(pq)=(p−1)(q−1)
2.gcd(ϕ(n),e)=1
(这里我通过某种手段获取到了that gilr 的个人信息,包括但不限于姓名、学号、生日......)通过对其组合加密生成了模n:1455925529734358105461406532259911790807347616464991065301847
首先,将明文存为bytes形式(在Python语言中,数据是以bytes形式(也就是扩展ASCII码保存的))

呦,有点意思:
关注一下报错
原来在pow函数中,要求输入的数值均为int类型,所以bytes_to_long即可,然,我怎么也装不上Crypto库,于是乎,手撕bytes:

,加密,加密,加密!!!

大功告成,还有什么比爱情密码更美妙的东西吗?
脆弱性分析
考虑到接受方的专业程度,这里的n可以很容易被大因数分解攻击破解。
实践是检验真理的唯一标准
我下铺那哥们拿到爱情密码,激动万分、感激不尽、喜极而泣。
然后他就跑去表白了
然,不是所有的女生都叫女黑客。

后话
看我明文写的啥:
