CTF-RSA多组公钥,模数共用素因子

模N不互素(多组公钥,其中的模数共用了素因子)

原理

当题目提供了多组N值,这多组N值之间可能存在公因数,即私钥 p或 q。

例题 【2022羊城杯 Easy RSA】
#task.py
from flag import flag
from Crypto.Util.number import *

m = bytes_to_long(flag)

e = 65537
f = open("output.txt", "r")
a = f.readlines()

for i in a:
 n = int(i)
 c = pow(m, e, n)
 m = c
print 'c = %s' % (m)
f.close()

题目分析:

读取output文件,每次的模数N就是output文件中的一行数字,也就是说用了多组N去不断加密明文。

首先测试这多组N值之间是否存在公因数。

from gmpy2 import *
f = open("output.txt","r").read().splitlines()
print(f)

p = gcd(int(f[0]), int(f[1]))
for i in range(len(f) - 1):
     assert gcd(int(f[i]), int(f[i+1])) == p
     print('ok')

然后我们就已经得到了p,且已知每次的n,以及e,下面只需要从后向前解密就行了,要从后向前啊啊啊。

for n in n_list[::-1]:
    q = n//p
    d = invert(e,(q-1)*(p-1))
    m = pow(c,d,n)
    c = m
print(long_to_bytes(m))
CTF (Capture the Flag) 中的 RSA (Rivest-Shamir-Adleman) 公钥解签名通常是指使用公钥对数字签名进行验证的过程,这是非对称加密的一部分,用于确保消息的完整性和来源的真实性。 在 Python 中,你可以使用 `cryptography` 库来处理 RSA公钥解签。下面是一个简单的示例: ```python from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import padding, rsa from cryptography.exceptions import InvalidSignature # 假设我们已经有了公钥和私钥文件 public_key_path = 'path_to_public.pem' private_key_path = 'path_to_private.pem' # 加载公钥和私钥 with open(public_key_path, "rb") as f: public_key = serialization.load_pem_public_key(f.read()) with open(private_key_path, "rb") as f: private_key = serialization.load_pem_private_key(f.read(), password=None) def verify_signature(message, signature, public_key): try: public_key.verify( signature=signature, data=message, padding=padding.PSS(mgf=mgf1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH), hash_algorithm=hashes.SHA256() ) print("Signature is valid.") except InvalidSignature: print("Signature is invalid.") # 示例使用:假设收到的是已签名的消息 message = b"Your secret message here" signature = b"..." # 假设已经获取到的签名 verify_signature(message, signature, public_key) ``` 在这个例子中,你需要提供一个有效的签名以及对应的原始消息,然后公钥会尝试验证这个签名是否有效。如果验证失败,`InvalidSignature` 异常会被抛出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值