RSA(1)

const char* N_str = "10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531469002933770824382865926730400902798743137187335810705309884635534159797732259520594337385186897629868362414475309001507719259272508669419676508606630823351242964205044695669333236417591";

const char* e_str = "10335071977839588495324343307012721241868030345867699233451500809021555989403028103743221782417440900848403102247012012875905268518785845678756696925714007988778268752026049276281025329038071087021446834856566687537729918372863729292015978809506607411711073716898691660211835403800810547133032654209857";

const char *c_star_s = "775789568255447714013247918834475198679653917741675336925599335265205597974556878796619688391490153400553690715156825186410083467239441867930362368759072824742512821423959166270736914130604102452801162684877374802075310241079026986641176079329871431448404341153307957496668749957011118721172866996397";
/*
	解密函数,利用简单的选择密文攻击。
*/
void decrypt(mpz_t& plaintext, const mpz_t ciphertext, const mpz_t exp, const mpz_t modulus){
    mpz_t two, inv, tem;
    mpz_init_set_ui(two, 2);
    mpz_init(inv);
    mpz_init(tem);
    mpz_powm_sec(tem, two, exp, modulus);//get 2^e
    mpz_invert(inv, two, modulus);//get 2^-1
    mpz_mul(tem, tem, ciphertext);//get 2^e * c
    mpz_mod(tem, tem, modulus);//get (2^e * c) % n
    char* s = dec(tem);// get (2^e * c)^d = 2 * m
    mpz_set_str(tem, s, 10);
    mpz_mul(plaintext, tem, inv);
    mpz_mod(plaintext, plaintext, modulus);

    mpz_clear(tem);
    mpz_clear(inv);
    mpz_clear(two);
}

结果:m = 101

/*
	加密函数:利用GMP库的快速幂模。
*/
void encrypt(mpz_t& ciphertext, const mpz_t plaintext, const mpz_t exp, const mpz_t modulus){
    mpz_powm_sec(ciphertext, plaintext, exp, modulus);
}

当 明文 m = 2,e,n 不变时,密文 c =
‘9067993150851350040249897330940003100665871287716549714273184556080551008582162191777849267361010347376371501646649765998332838344355796861130182509325000900356725318223518748891662536797029020330744349901424317997065435840708142346025689563914369112793553577470739040917484329683228525646890008609925’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值