前言:
昨天完成了201号测试的前五个阶段,发题解给学长,得到了304号测试与828号测试!当我看到这两个题目,感觉有点困难,知识点很陌生,不知道从哪先开始,于是我跑去刷了一下oj题。 今天解决了RSA1,RSA2有点思路,还没有得到结果。
知识点:
1.RSA介绍
加密过程
(1)选择两个大素数p和q,计算出模数N = p * q
(2)计算φ = (p−1) * (q−1) 即N的欧拉函数,然后选择一个e (1<e<φ),且e和φ互质
(3)取e的模反数为d,计算方法: e * d ≡ 1 (mod φ)
(4)对明文A进行加密:B≡A^e (mod n) 或 B = pow(A,e,n),得到的B即为密文
(5)对密文B进行解密,A≡B^d( mod n) 或 A = pow(B,d,n),得到的A即为明文
其中:
p 和 q :大整数N的两个因子
N:大整数N,我们称之为模数
e 和 d:互为模反数的两个指数
c 和 m:分别是密文和明文,这里一般指的是一个十进制的数
(N,e):公钥
(N,d):私钥
加密分析
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e、d。
(1) n是两个大质数p、q的积,n以二进制表示时所占用的位数,就是所谓的密钥长度。
(2)e和d是一对相关的值,e可以任意取,但要求e与(p-1)(q-1)互质;再选择d,要求(ed) ≡ 1(mod(p-1)×(q-1))。
令φ = (p-1)(q-1) 上式即 d * e = 1 mod φ 即:( d * e - 1)% φ = 0
(3)(n,e)
,(n,d)
就是密钥对。其中(n,e)为公钥,(n,d)为私钥。RSA加解密的算法完全相同,设A为明文,B为密文,则:A≡B^d( mod n);B≡A^e (mod n);(公钥加密体制中,一般用公钥加密,私钥解密)
(4) e和d可以互换使用,即:
A≡B^e (mod n);B≡A^d( mod n);
2.OpenSSL使用
1.生成一个密钥:
openssl genrsa -out test.key 1024
这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。
2.openssl可以将这个文件中的公钥提取出来:
openssl rsa -in test.key -pubout -out test_pub.key
-in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥(包含公钥)。现在可以将用公钥来加密文件了。
3在目录中创建一个hello的文本文件,然后利用此前生成的公钥加密文件:
openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en
-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。
4.解密文件:
openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de
题目解析:
本题给了一个加密文件,还有一个解密私钥,我们只需用到上述的第四条即可。
openssl rsautl -decrypt -in flag.encrypt -inkey rsa_private_key.pem -out flag.txt
-decrypt :进行解密。
-in flag.encrypt:对该文件进行解密。
-inkey rsa_private_key.pem:指定私钥。
-out flag.txt:将解密内容输出在flag.txt中。
总结
RSA第一题虽然简单,但需要了解的内容还是很多的,需要学会openssl的使用,以及RSA的原理。另外关于RSA第二题,有一些小思路,可能需要从公钥中提取出来n和e,再将n分解成p和q,然后再组成私钥,在进行解密。以后尝试一下!