C 打印MPI的无符号整数(以10为基数/十进制)值

C 打印MPI的无符号整数(以10为基数/十进制)值,c,encryption,libgcrypt,C,Encryption,Libgcrypt,我正在尝试确认/获取十六进制mpi值的无符号int(基数10/十进制)值。我正在使用以下代码: #include <gcrypt.h> #include <stdio.h> static gcry_mpi_t privkey = NULL; int main(){ char *parmstr = "48BFDA215C31A9F0B226B3DB11F862450A0F30DA"; printf("starting program\n");

我正在尝试确认/获取十六进制mpi值的无符号int(基数10/十进制)值。我正在使用以下代码:

#include <gcrypt.h>
#include <stdio.h>

static gcry_mpi_t privkey = NULL;

int main(){

    char *parmstr = "48BFDA215C31A9F0B226B3DB11F862450A0F30DA";

    printf("starting program\n");

    gcry_mpi_scan(&privkey, GCRYMPI_FMT_HEX, (char *)parmstr, 0, NULL);

    printf("printing hashed (?) mpi\n");
    gcry_mpi_dump(privkey);
    printf("\n");

    size_t gablen;
    unsigned char *result;
    /* get length */
    gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &gablen, privkey);
    result = gcry_malloc_secure(gablen);
    /* get actual value */
    gcry_mpi_print (GCRYMPI_FMT_USG, result, gablen, NULL, privkey);

    /* print actual value */
    printf("result: %s\n", result);

    printf("finished\n");
}
我将使用'result:'行打印实际的无符号int(以10为基数/十进制)值

私钥是从我尝试使用的现成的洋泾浜插件中提取的

编辑:

有人能确认实际的无符号整数(基数10/十进制)值应该是

415325779662433871844955547383752003988573073626

我可能会更新程序,用这个值在gcrypt中创建一个新的mpi,并查看十六进制值是否与我已有的值相同。今天晚些时候我会这样做

编辑2:

因此,我尝试执行以下操作来打印上面提到的int值的十六进制值。出了点问题:

gcry_mpi_t cript_prime;
char buffer[50] = {0};
char number[50] = {0};

cript_prime = gcry_mpi_new(50);

strcpy(number,"415325779662433871844955547383752003988573073626");
gcry_mpi_scan(&cript_prime,GCRYMPI_FMT_USG,number,sizeof(number),NULL);

gcry_mpi_print(GCRYMPI_FMT_USG,buffer,sizeof(buffer),NULL,cript_prime);

printf("The number tested is: %s\n",buffer);

printf("trying to convert to HEX\n");

/* get actual value */
gcry_mpi_print (GCRYMPI_FMT_HEX, buffer, sizeof(buffer), NULL, cript_prime);
/* print actual value */
printf("result: %s\n", buffer);
输出为:

result: 48BFDA215C31A9F0B226B3DB11F862450A0F30DA
The number tested is: 415325779662433871844955547383752003988573073626
trying to convert to HEX
result: 415325779662433871844955547383752003988573073626
编辑3:

我对帖子进行了一些更新,基本上我正在尝试打印gcrypt库生成的十六进制值的base10十进制值。我正在寻找这个值,以确认我为读取这些值所做的实现。我正在寻找一个gcrypt函数来实现这一点。gcrypt似乎不支持这一点

此行将nul字节放入
结果中偏移量1处的字节中。我看不出在何处初始化偏移量为零的字节,但偏移量为2和更高版本的字节超过了所构造字符串的末尾。它格式化的字符串从结果+5开始,因此您应该在此处打印:


这是一个工作脚本,缓冲区太小

#include <gcrypt.h>
#include <stdio.h>

int main(){
    gcry_error_t err;
    gcry_mpi_t cript_prime;
    unsigned char buffer[401] = {0};
    char number[101] = {0};

    cript_prime = gcry_mpi_new(101);

    strcpy(number, "415325779662433871844955547383752003988573073626");
    gcry_mpi_scan(&cript_prime, GCRYMPI_FMT_USG, number, sizeof(number), NULL);

    err = gcry_mpi_print(GCRYMPI_FMT_USG, buffer, sizeof(buffer), NULL, cript_prime);

    if (err != 0){
      printf("error: %d\n", err);
      return -1;
    }

    printf("The number tested is: %s\n",buffer);

    printf("trying to convert to HEX\n");

    /* get actual value */
    err = gcry_mpi_print(GCRYMPI_FMT_HEX, buffer, sizeof(buffer), NULL, cript_prime);

    if (err != 0){
      gcry_err_code_t code = gcry_err_code(err);
      printf("error: %d\n", code);
      return -1;
    }

    /* print actual value */
    printf("result: %s\n", buffer);

    printf("finished\n");

    return 0;
}
#包括
#包括
int main(){
gcry\u error\u t err;
gcry_mpi_t script_prime;
无符号字符缓冲区[401]={0};
字符数[101]={0};
script_prime=gcry_mpi_new(101);
strcpy(编号:415325779662433871844955547383752003988573073626);
gcry\u mpi\u扫描(&script\u prime,GCRYMPI\u FMT\u USG,number,sizeof(number),NULL);
err=gcry\u mpi\u print(GCRYMPI\u FMT\u USG,buffer,sizeof(buffer),NULL,script\u prime);
如果(错误!=0){
printf(“错误:%d\n”,错误);
返回-1;
}
printf(“测试的数字是:%s\n”,缓冲区);
printf(“试图转换为十六进制”\n);
/*获取实际值*/
err=gcry\u mpi\u print(GCRYMPI\u FMT\u十六进制,缓冲区,sizeof(缓冲区),NULL,script\u prime);
如果(错误!=0){
gcry\u err\u code\u t code=gcry\u err\u code(err);
printf(“错误:%d\n”,代码);
返回-1;
}
/*打印实际值*/
printf(“结果:%s\n”,缓冲区);
printf(“完成的”\n);
返回0;
}
我还通过这个网站确认了我的想法:


这将显示十六进制(base-16)48BFDA215C31A9F0B226B3DB11F862450A0F30DA实际值为4153257796624337620804042064628666084640806848(base-10)

感谢您的反馈。我更新了示例。它现在打印“垃圾”。我正在寻找要打印的实际数字。嗯,\x48是H,\x21是!,所以它看起来很像
FMT#u USG
只是复制二进制值,也就是说,“integer”不是指“可打印的整数”,而是指“二进制整数”。谢谢,我在C#中编写了一个示例应用程序,解析了该数据,并得到了编辑中提到的结果。我将更新我的程序,看看这是否匹配。我更新了我的帖子,用一个例子将int值转换为HEX,遗憾的是这不起作用。所以。。。您正在编写一个加密库,却在将十六进制值转换为十进制值时遇到了困难?我更新了帖子,基本上我正在尝试获取gcrypt库生成的十六进制值的基数10/十进制值。
result[1] = (gablen >> 24) & 0xff;
gcry_mpi_print (GCRYMPI_FMT_USG, result + 5, gablen, NULL, privkey);
...
printf("result: %s\n", result + 5);
#include <gcrypt.h>
#include <stdio.h>

int main(){
    gcry_error_t err;
    gcry_mpi_t cript_prime;
    unsigned char buffer[401] = {0};
    char number[101] = {0};

    cript_prime = gcry_mpi_new(101);

    strcpy(number, "415325779662433871844955547383752003988573073626");
    gcry_mpi_scan(&cript_prime, GCRYMPI_FMT_USG, number, sizeof(number), NULL);

    err = gcry_mpi_print(GCRYMPI_FMT_USG, buffer, sizeof(buffer), NULL, cript_prime);

    if (err != 0){
      printf("error: %d\n", err);
      return -1;
    }

    printf("The number tested is: %s\n",buffer);

    printf("trying to convert to HEX\n");

    /* get actual value */
    err = gcry_mpi_print(GCRYMPI_FMT_HEX, buffer, sizeof(buffer), NULL, cript_prime);

    if (err != 0){
      gcry_err_code_t code = gcry_err_code(err);
      printf("error: %d\n", code);
      return -1;
    }

    /* print actual value */
    printf("result: %s\n", buffer);

    printf("finished\n");

    return 0;
}