【问题标题】:Print unsigned int (base 10 / decimal) value of MPI打印 MPI 的 unsigned int (base 10 / decimal) 值
【发布时间】:2013-02-26 02:52:05
【问题描述】:

我正在尝试确认/获取十六进制 mpi 值的无符号整数(基数 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");
}

我得到以下结果:

    $ ./foo
    starting program
    printing hashed (?) mpi
     48BFDA215C31A9F0B226B3DB11F862450A0F30DA
    result: H¿Ú!\1©ð²&³ÛøbE
0Ú
    finished

我会在 'result:' 行打印实际的 unsigned int (base 10 / decimal) 值。

私钥取自我正在尝试使用的 Off-The-Record Pidgin 插件。

编辑:

任何人都可以确认实际的 unsigned int (base 10 / decimal) 值应该是

415325779662433871844955547383752003988573073626

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

编辑 2:

所以我正在尝试执行以下操作来打印上述 int 值的 HEX 值。出了点问题:

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 好像不支持这个?

【问题讨论】:

  • 所以...您正在编写一个加密库,却被困在将十六进制值转换为十进制值?
  • 我更新了帖子,基本上我正在尝试获取 gcrypt 库生成的十六进制值的基数 10/十进制值。

标签: c encryption libgcrypt


【解决方案1】:
result[1] = (gablen >> 24) & 0xff;

这一行将一个 nul 字节放入到 result 的偏移量 1 的字节中。我看不到您曾经在哪里初始化偏移量为零的字节,但是偏移量 2 和更高版本的字节超出了您构造的字符串的末尾。它格式化的字符串从 result+5 开始,所以你应该在这里打印:

gcry_mpi_print (GCRYMPI_FMT_USG, result + 5, gablen, NULL, privkey);
...
printf("result: %s\n", result + 5);

【讨论】:

  • 感谢您的反馈。我更新了这个例子。它现在打印“垃圾”。我正在寻找要打印的实际数字。
  • 嗯,\x48 是 H,\x21 是 !,所以看起来很像 FMT_USG 只是复制二进制值,即“整数”并不意味着“可打印整数”而是“二进制整数”。
  • 谢谢,我用 C# 编写了一个示例应用程序来解析该数据并得到编辑中提到的结果。我会更新我的程序,看看是否匹配。
  • 我用一个示例更新了我的帖子,将 int 值转换为 HEX,遗憾的是这不起作用。
【解决方案2】:

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

#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;
}

我也通过这个网站确认了我的想法:http://www.unitconversion.org/numbers/base-10-to-base-16-conversion.html

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

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多