mpz_set_srt将0设置为mpz_t

时间:2014-11-05 19:46:19

标签: c gmp

void decrypt_cert(mpz_t decrypted_cert, cert_message *cert, mpz_t key_exp, mpz_t key_mod) {
    mpz_t certificate;
    mpz_init(certificate);
    puts(cert->cert); // Prints Hex values i.e 0x98A6C
    mpz_set_str(certificate, cert->cert, HEX_BASE);
    puts(mpz_get_str(NULL,16,certificate)); // Prints 0
    perform_rsa(decrypted_cert, certificate, key_exp, key_mod);
}

在我上面的方法中。第1行puts(cert->cert);打印cert->cert的正确值但是当我使用此值设置certificate并将certificate转换回字符串puts(mpz_get_str(NULL,16,certificate));时,会打印出0 }。

我的代码有什么问题吗?

2 个答案:

答案 0 :(得分:2)

请参阅documentation。在mpz_set_str中,要么传递0的基数(因此它使用0x来猜测基数),要么省略字符串中的前导0x

答案 1 :(得分:2)

 mpz_set_str(certificate, cert->cert, HEX_BASE);
如果字符串以0x开头,

将无法解析您的字符串。

你要么:

  • 传递0作为基础,在这种情况下,mpz_set_str将字符串解析为十六进制,如果它以0x开头
  • 将基数传入16并跳过0x。即致电mpz_set_str(certificate, &cert->cert[2], HEX_BASE);

以下是一个小样本程序,您可以通过传入来进行测试。 “0x1234”vs“1234”

#include <gmp.h>
#include <stdio.h>
int  main(int argc, char *argv[])
{
    int rc;
    mpz_t certificate; 
    mpz_init(certificate);
    rc = mpz_set_str(certificate, "1234", 16);
    printf("mpz_set_str returned %d\n", rc);
    puts(mpz_get_str(NULL,16,certificate)); 
    return 0;

}