[关闭]
@2017libin 2019-10-29T09:31:26.000000Z 字数 1827 阅读 67

破解rsa

密码学


简述

  一开始,直接将密文丢入dec()中,运行得到如下截图:
  
  破解rsa1.png
 
  果然斌头的作业不会这么简单,于是构造一个新的密文: C = 。对进行解密,得到。最终除以得到明文
  
  破解rsa.png

源代码

  1. #include <iostream>
  2. #include <gmp.h>
  3. #include "dec.h"
  4. using namespace std;
  5. const char* N_str = "10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531469002933770824382865926730400902798743137187335810705309884635534159797732259520594337385186897629868362414475309001507719259272508669419676508606630823351242964205044695669333236417591";
  6. const char* e_str = "10335071977839588495324343307012721241868030345867699233451500809021555989403028103743221782417440900848403102247012012875905268518785845678756696925714007988778268752026049276281025329038071087021446834856566687537729918372863729292015978809506607411711073716898691660211835403800810547133032654209857";
  7. const char *c_star_s = "775789568255447714013247918834475198679653917741675336925599335265205597974556878796619688391490153400553690715156825186410083467239441867930362368759072824742512821423959166270736914130604102452801162684877374802075310241079026986641176079329871431448404341153307957496668749957011118721172866996397";
  8. //const char *m_text_s = "2";
  9. int main()
  10. {
  11. mpz_t e, n, c, tmp, M;
  12. mpz_init_set_str(e, e_str, 10); //初始化
  13. mpz_init_set_str(n, N_str, 10);
  14. mpz_init_set_str(c, c_star_s, 10);
  15. mpz_init_set_str(tmp, "2", 10);
  16. mpz_powm(tmp, tmp, e, n); //tmp = 2^e
  17. mpz_mul(c, c, tmp); //c = c*2^e mod n
  18. mpz_mod(c, c, n);
  19. char *m2 = dec(c); //对c*2^e = (2*m)^e解密
  20. mpz_init_set_str(M, m2, 10); //M = 2*m = m2
  21. //求2的逆元
  22. mpz_set_str(tmp, "2", 10);
  23. mpz_t g,s,t;
  24. mpz_init(g);
  25. mpz_init(s);
  26. mpz_init(t);
  27. mpz_gcdext(g,s,t,tmp,n); //tmp*s+ n*t = g = gcd(tmp,n)
  28. mpz_add(s,s,n); //s = 2^(-1)
  29. mpz_mod(s,s,n);
  30. //2m/2 = 2m*2^(-1)
  31. mpz_mul(M,M,s);
  32. mpz_mod(M,M,n);
  33. gmp_printf("m is %Zd\n", M);
  34. //清除变量
  35. mpz_clear(t);
  36. mpz_clear(g);
  37. mpz_clear(s);
  38. mpz_clear(e);
  39. mpz_clear(n);
  40. mpz_clear(c);
  41. mpz_clear(tmp);
  42. mpz_clear(M);
  43. return 0;
  44. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注