第五周心得与体会
1.pycharm安装
先在[pycharm官网](PyCharm:JetBrains为专业开发者提供的Python IDE)首页下载最新版的pycharm,安装程序下载好后,双击打开,更改安装路径后,就可以等待安装成功了,安装好的程序如下图所示:
2.pycharm中python的配置
双击打开刚才安装好的pycharm,点击新建项目
编辑文件目录和基础解释器选择提前下载好的python点击创建即可
3.在python中实现base64的加密和解密
首先在刚才新建的项目中选择新建文件,其次我们只需要调用python中内置的base64模块来进行 Base64 编码和解码,具体的编码如下图所示:
import base64
def base64_encode(data):
# 使用 base64 编码
encoded_bytes = base64.b64encode(data.encode('utf-8'))
# 将字节数据转换为字符串
encoded_string = encoded_bytes.decode('utf-8')
return encoded_string
def base64_decode(encoded_string):
# 将字符串转换为字节数据
encoded_bytes = encoded_string.encode('utf-8')
# 使用 base64 解码
decoded_bytes = base64.b64decode(encoded_bytes)
# 将字节数据转换为字符串
decoded_string = decoded_bytes.decode('utf-8')
return decoded_string
# 示例数据
original_data = "Hello, World!"
# 加密
encoded_data = base64_encode(original_data)
print("Base64 编码后:", encoded_data)
# 解密
decoded_data = base64_decode(encoded_data)
print("Base64 解码后:", decoded_data)
4.ctfshow crypto模块
4.1Pass-01
第一道签到题比较简单,可以看出它是倒序排列,直接简单转换即可得到flag{ctf.show}
4.2 Pass-02
题目中所呈现的是大量由{}[]+!四种符号组成的密文,可以判断出这是属于JSFuck类型的加密
我们可以将其全选复制后,打开火狐浏览器的控制台,将密文输入后,右键即可自动解析
4.3 Pass-03
题目中所呈现是大量的乱码和一两个颜文字,我们将文件下载到电脑桌面,选择用记事本打开,就可以看到没有乱码的由颜文字组成的密文,这是aaencode加密方式,其特征是将JS代码转换成常用的网络表情,例如(o_o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+
我们同样可以将其全选复制,打开火狐浏览器的控制台,将密文输入后,右键即可自动解析
4.4 Pass-04
题目中提供了三个数字p=447685307 q=2037 e=17,需要让我们求出d
根据其所提供的p q e我们可以联想到这是ras加密中的密钥生成的基本步骤:
-
选择两个大素数,记为p和q:
- 随机选择两个大素数,例如,p = 61和q = 53。
-
计算n = pq,n是公共模数:
- 计算n = 61 * 53,得到n = 3233。
-
计算欧拉函数φ(n) = (p-1)(q-1):
- 计算φ(n) = (61-1)(53-1) = 60 * 52 = 3120。
-
选择一个整数e,1 < e < φ(n),且e与φ(n)互质。e将作为公钥的一部分:
- 选择一个满足条件的整数e,例如,e = 17。这里要确保e与φ(n) = 3120互质。
-
计算整数d,使得ed ≡ 1 (mod φ(n))。d将作为私钥的一部分:
- 计算d,满足17d ≡ 1 (mod 3120)。可以使用扩展欧几里得算法来找到d的值。在这个例子中,d = 2753
我们可以使用python编写一个程序来进行计算:
def extended_gcd(a, b): if a == 0: return (b, 0, 1) else: g, x, y = extended_gcd(b % a, a) return (g, y - (b // a) * x, x) def modinv(a, m): g, x, y = extended_gcd(a, m) if g != 1: raise Exception('Modular inverse does not exist') else: return x % m p = 447685307 q = 2037 e = 17 n = p * q phi_n = (p - 1) * (q - 1) # 计算模反元素d d = modinv(e, phi_n) print("私钥 d =", d)
我们将代码运行后即可求得d
4.5 Pass-05
题目形式与第四题类似,给我们提供了p=447685307 q=2037 e=17 c=704796792四个数据,求m
我们可以联想到这是ras加密后续求解:
RSA算法中,加密明文用到公式:
c = m^e mod n
解疑: c是cipher,密文; m是message,明文; e是加密指数; n是公钥。
该变式在rsa算法中等价于:
c≡ m^e mod n
解疑: “≡”是同余符号,mod是求余数,在python中表示为%。 两个整数a,b,若它们除以整数m所得的余数相等, 则称a,b对于模m同余 记作 a ≡ b (mod m)
我们可以使用python编写一个程序:
def decrypt_rsa(c, d, n):
# 使用 pow 函数进行模幂运算
m = pow(c, d, n)
return m
# 给定的参数
p = 447685307
q = 2037
e = 17
d = 53616899001
c = 704796792
# 计算模数 n
n = p * q
# 解密密文得到明文
m = decrypt_rsa(c, d, n)
print("解密后的明文 m:", m)
我们将代码输入pycharm后,即可求出m的值