【问题标题】:The result of the encrypted message after implementing RSA is 0 using the GMP library使用GMP库实现RSA后加密消息的结果为0
【发布时间】:2021-01-17 20:25:41
【问题描述】:

我正在使用 GMP 库函数来实现 RSA 算法。 这是我的代码:

const char* random_String() {
    srand (time(NULL)); 
    const char * tab[] = {"Alice", "Bob", "encryption", "decryption"};
    std::cout << sizeof(tab)/sizeof(tab[0]) << std::endl;
    int indice = rand() % (sizeof(tab)/sizeof(tab[0]));
    
    return tab[indice];
}


int main()
{
    mpz_init(d);
    mpz_init(e);
    mpz_init(n);
    
    mpz_init(M);
    mpz_init(c);
    
 
    /* This function creates the keys. The basic algorithm is...
     *
     *  1. Generate two large distinct primes p and q randomly
     *  2. Calculate n = pq and x = (p-1)(q-1)
     *  3. Select a random integer e (1<e<x) such that gcd(e,x) = 1
     *  4. Calculate the unique d such that ed = 1(mod x)
     *  5. Public key pair : (e,n), Private key pair : (d,n)
     *
     */
   mpz_t p,q,op;
   mpz_init(p);
   mpz_init(q);
   mpz_init(op);
    
   char p_str[1000];
   char q_str[1000];
    
   mpz_init_set_str(op, "7060", 10);
   mpz_nextprime(p, op);
   mpz_get_str(p_str,10,p);
   
   mpz_init_set_str(op, "7874", 10);
   mpz_nextprime(q, op);
   mpz_get_str(q_str, 10, q);
   
   std::cout << "Random Prime 'p' = " << p_str <<  std::endl;
   std::cout << "Random Prime 'q' = " << q_str <<  std::endl;

    char n_str[1000];
    mpz_t x;
    mpz_init(x);

    mpz_mul(n,p,q);
    mpz_get_str(n_str,10,n);
    std::cout << "\t n = " << n_str << std::endl;
    
    mpz_t p_minus_1,q_minus_1;
    mpz_init(p_minus_1);
    mpz_init(q_minus_1);

    mpz_sub_ui(p_minus_1,p,(unsigned long int)1);
    mpz_sub_ui(q_minus_1,q,(unsigned long int)1);

    mpz_mul(x,p_minus_1,q_minus_1);
    char phi_str[1000];
    mpz_get_str(phi_str,10,x);
    std::cout << "\t phi(n) = " << phi_str << std::endl;

    mpz_init_set_str(e, "79", 0);
    char e_str[1000];
    mpz_get_str(e_str,10,e);
    std::cout << "\t e = " << e_str << std::endl;
     
    mpz_invert(d, e, x);
    char d_str[1000];
    mpz_get_str(d_str,10,d);
    std::cout << "\t d = " << d_str << std::endl << std::endl;


    std::cout << "Public Keys  (e,n): ( " << e_str <<" , " << n_str << " )" << std::endl;
    std::cout << "Private Keys (d,n): ( " << d_str <<" , " << n_str << " )" << std::endl;
    

    const char* mess = random_String();
    char c_str[1000];

    std::cout << "The message: : " << mess << std::endl;
    mpz_set_str(M, mess, 10);
    mpz_powm(c, M, e, n);
    mpz_get_str(c_str, 10, c);
    std::cout << "The encrypted message: " << c_str << std::endl;
  
}

在代码的最后 5 行中,我使用之前计算的值并遵循 RSA 加密公式对消息进行加密。 密文的结果是0,也就是说c_str的结果是0,怎么会是0呢?

【问题讨论】:

    标签: c++ encryption rsa gmp


    【解决方案1】:

    这段代码

    mpz_set_str(M, mess, 10);
    

    将随机字符串mess 转换为整数。为此,字符串必须由十进制数字组成,但对于任何随机字符串都不是这样。所以函数失败,M 不变。

    如果你检查mpz_set_str的返回值,你会看到它是-1,意味着函数失败了。

    基本上,只有当消息是十进制数字时,您才能将消息与整数进行转换。要转换任意字符串,您应该使用mpz_importmpz_export 函数而不是mpz_set_strmpz_get_str

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2023-01-19
      • 2011-02-08
      • 2019-10-12
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多