【BUUCTF】Crypto_RSA(铜锁/openssl使用系列)

【BUUCTF】Crypto_RSA(铜锁/openssl使用系列)

1、题目

在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交

在这里插入图片描述

2、解析

RSA加密过程:
1)选择素数:选择两个不同的大素数,通常记为p和q;
2)计算N:将这两个素数相乘,得到一个大整数N,即N = p * q。(N为RSA的模数)
3)计算欧拉函数φ(N):φ(N) = (p-1) * (q-1)。(欧拉函数φ(N)表示小于N且与N互质的正整数的个数)
4)选择公钥e:选择一个与φ(N)互质的小整数e,通常选择65537(即2^16 + 1),这个值常用因为它只有两个非零位,加速了加密运算。
5)计算私钥d:(e * d) mod φ(N) = 1。(使用扩展的欧几里得算法计算e对于φ(N)的模逆d)

3、编码

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <iostream>

using namespace std;

int RSA_D() {
    // 给定的p、q和e值
    const char* p_str = "473398607161";
    const char* q_str = "4511491";
    const char* e_str = "17";

    // 将p、q和e转换为BIGNUM类型
    BIGNUM* p = BN_new();
    BIGNUM* q = BN_new();
    BIGNUM* e = BN_new();
    BN_dec2bn(&p, p_str);
    BN_dec2bn(&q, q_str);
    BN_dec2bn(&e, e_str);

    // 计算N = p * q 和 φ(N) = (p - 1) * (q - 1)
    BIGNUM* N = BN_new();
    BN_CTX* ctx = BN_CTX_new();
    BN_mul(N, p, q, ctx);
    BIGNUM* phi_N = BN_new();
    BN_sub(p, p, BN_value_one());
    BN_sub(q, q, BN_value_one());
    BN_mul(phi_N, p, q, ctx);

    // 计算d = e^(-1) mod φ(N)
    BIGNUM* d = BN_new();
    BN_mod_inverse(d, e, phi_N, ctx);

    // 显示d的十进制值
    char* d_str = BN_bn2dec(d);
    cout << "d: " << d_str << endl;

    // 释放资源
    BN_free(p);
    BN_free(q);
    BN_free(e);
    BN_free(N);
    BN_free(phi_N);
    BN_free(d);
    BN_CTX_free(ctx);

    return 0;
}

int main() {
    RSA_D();
    return 0;
}

编译运行:
在这里插入图片描述

4、提交

flag{125631357777427553}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值