功能:void mpz_init_set (mpz_t rop , const mpz_t op ) 功能:void mpz_init_set_ui (mpz_t rop , unsigned long int op ) 功能:void mpz_init_set_si (mpz_t rop , signed long int op ) 功能:void mpz_init_set_d (mpz_t rop , double op ) 用肢体空间初始化rop并从op设置初始数值 。
函数:int mpz_init_set_str (mpz_t rop , const char * str , int base ) 初始化rop并将其值设置为mpz_set_str(有关详细信息,请参阅上面的文档)。
功能:void mpz_pow_ui (mpz_t rop , const mpz_t base , unsigned long int exp ) 功能:void mpz_ui_pow_ui (mpz_t rop , unsigned long int base , unsigned long int exp ) 将rop设置为base提升到exp。情况 0^0产生 1。
其实就是 void mpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod) [Function] Set rop to base^exp mod mod. 但看官方文档看不明白
其实就是计算 base 的 exp 次方,并对 mod 取模,最后将结果写入 rop 中 这个运算的过程和RSA的加密过程一样。
图中的C是密文,M是明文,D是私钥(私钥由这个公式计算得出E * D % φ(N) = 1),N是公共模数(质数 P*Q得到N),MOD就是模运算,φ(N)是欧拉函数(由这个公式计算得出φ(N) = (P-1)(Q-1))。
了解了加密解密的概念,
开始写脚本
脚本
已知
C = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35 N = 103461035900816914121390101299049044413950405173712170434161686539878160984549 E = 65537
fac: factoring 103461035900816914121390101299049044413950405173712170434161686539878160984549 fac: using pretesting plan: normal fac: no tune info: using qs/gnfs crossover of 95 digits
starting SIQS on c78: 103461035900816914121390101299049044413950405173712170434161686539878160984549
==== sieving in progress (1 thread): 36224 relations needed ==== ==== Press ctrl-c to abort and save state ==== 36248 rels found: 18898 full + 17350 from 185925 partial, (4669.49 rels/sec)
SIQS elapsed time = 44.9578 seconds. Total factoring time = 44.9838 seconds
得到p和q和e我们就能计算欧拉函数,然后我们就可以通过欧拉函数φ(N)和公钥E计算出私钥D。 使用python的gmpy2库计算私钥。(E * D % φ(N) = 1)
d = gmpy2.invert(e,(p-1)*(q-1))
d = 91646299298871237857836940212608056141193465208586711901499120163393577626813
计算私钥d我们就可以对密文C进行解密,解密算法(C的撕咬D次方对公共模数N取余)
使用python的gmpy2库计算明文
m = gmpy2.powmod(c,d,n)
m = 185534734614696481020381637136165435809958101675798337848243069
把m转为字符串即可
# 已知 C N E # 由 N 分解 P和Q import gmpy2 import binascii c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35 n = 103461035900816914121390101299049044413950405173712170434161686539878160984549 e = 65537 p = 282164587459512124844245113950593348271 q = 366669102002966856876605669837014229419 d = gmpy2.invert(e, (p-1)*(q-1)) m = gmpy2.powmod(c, d, n) print(binascii.unhexlify(hex(m)[2:]).decode(encoding="utf-8")) # suctf{Pwn_@_hundred_years}