CTF(CaptureTheFlag)密码学高级

信息安全不简单鸭 2024-09-06 22:02:53

RSA是一种非对称加密算法,被广泛应用于数据加密、数字签名和密钥交换等领域。对于密码学,我只有敬畏,因为越学到后面越抽象,没有最强大脑,真的玩不转,毕业多年,大都只记得公钥加密,私钥解密了吧。

RSA算法的安全性基于大数分解问题的困难性,也就是将大整数 N 分解成其素数因子 p 和 q 的难度。因为在目前的算力下,对非常大的整数进行分解是一个非常耗时的过程,所以RSA加密当前被认为是非常安全的。

ailx10

网络安全优秀回答者

网络安全硕士

去咨询

1、RSA基础

已知RSA公钥生成参数:p = 3487583947589437589237958723892346254777q = 8767867843568934765983476584376578389e = 65537求d = 提交格式:flag{d}

直接python3编程

# -*- coding: utf-8 -*-p = 3487583947589437589237958723892346254777q = 8767867843568934765983476584376578389e = 65537n = p * qphi = (p - 1) * (q - 1)# 计算e的模反元素dd = pow(e, -1, phi)print("私钥d:", d)# 私钥d: 19178568796155560423675975774142829153827883709027717723363077606260717434369

2、open ssl 工具

RSA加解密是https的重要密码之一,其方法基本是安全的,但要确保N的位数足够(1024位),大数的质因数分解基本是不可能的。我们知道了RSA加解密是公钥加密,私钥解密。某种存在漏洞的情况可通过公钥求取私钥。给了私钥和加密后内容,求明文吧(openssl有相关工具)

直接使用openssl工具

openssl pkeyutl -decrypt -in clipher -inkey privatekey -out dec2openssl pkeyutl: openssl 命令行工具,用于执行公钥加密/解密操作以及其他密钥工具功能-decrypt: 表示进行解密操作-in clipher: 指定输入文件为「cipher」-inkey privatekey: 指定用于解密的私钥文件「privatekey」-out dec2: 指定输出文件「dec2」,解密后的数据将被写入这个文件

3、RSA 大整数分解

已知RSA的公钥「public.key」和一个加密文件「flag.enc」

(1)使用openssl 输出公钥文件中RSA模数(N)

openssl rsa -in public.key -pubin -text -modulus -in public.key 指定了输入文件为「public.key」-pubin 表示输入文件是一个公钥文件-text 表示以文本形式显示密钥的信息-modulus 表示要显示RSA模数(N)

(2)使用开源工具 yafu[1] 对RSA模数(N)进行大整数分解,生成P值和Q值

(3)根据P值和Q值,计算生成私钥

# -*- coding: utf-8 -*-from Crypto.PublicKey import RSA# 替换成你已知的 p 和 q 值p = 3133337 q = 2547832 # 太长了,只粘贴一部分# 计算模数 NN = p * q# 计算欧拉函数 φ(N)phi = (p - 1) * (q - 1)# 选择指数 ee = 65537 # 通常情况下选择较小的质数作为指数 e# 计算私钥 d# 使用 Crypto 库中的 RSA 模块来生成私钥key = RSA.construct((N, e))d = pow(e, -1, phi) # 计算 e 的模 φ(N) 的乘法逆元# 生成私钥private_key = RSA.construct((N, e, d))# 输出私钥print(private_key.export_key().decode())# 将私钥写入文件 priv.keywith open("priv.key", "wb") as file: file.write(private_key.export_key("PEM"))

最终输出私钥 priv.key 如下:

(4)使用私钥 priv.key 对密文进行解密

# -*- coding: utf-8 -*-from Crypto.PublicKey import RSAfrom Crypto.Cipher import PKCS1_OAEPimport base64# 读取 RSA 私钥文件with open("priv.key", "rb") as key_file: private_key = RSA.import_key(key_file.read())# 读取经过Base64编码的密文文件with open("flag.enc", "rb") as encrypted_file: base64_encoded_message = encrypted_file.read()# 对Base64编码的密文进行解码encrypted_message = base64.b64decode(base64_encoded_message)# 使用私钥解密密文cipher_rsa = PKCS1_OAEP.new(private_key)decrypted_message = cipher_rsa.decrypt(encrypted_message)# 输出解密后的明文信息print(decrypted_message.decode())# EKO{classic_rsa_challenge_is_boring_but_necessary}参考^yafu https://github.com/bbuhrow/yafu
0 阅读:1