【问题标题】:Print a big integer stored as an unsigned long long array打印存储为 unsigned long long 数组的大整数
【发布时间】:2020-07-26 13:19:32
【问题描述】:

我正在审查一个大学项目的应用程序的安全性,该应用程序使用 RSA 加密文件,特别是它使用这个库:https://github.com/ilansmith/rsa(不要使用它,它有严重的漏洞)。

(如果你想看一看,这些数字之间的大部分操作都是在rsa_num.c文件中实现的。)

此工具使用 unsigned long long 的数组来存储 RSA 所需的大数字(ned):

typedef struct {
    u64 arr[17]; //u64 is defined as unsigned long long
    int top;     //points to the last occupied slot of the array
} u1024_t;

问题是我不明白数字是如何以这种格式存储的。 我需要的是能够以某种方式打印实数,或者至少是一种从数组组件中恢复数字的方式。

我尝试像字符串一样将它们连接起来,但这似乎不对。

感谢能够提供帮助的人!

【问题讨论】:

  • 连接听起来是对的,只要你用十六进制做,索引 0 作为 LSB,直到 top,据我了解。
  • @Matthieu 进行基本的 hex->int 转换(例如使用 python 的 int(hex_string, 16)),“index 0 as LSB”意味着我可以从数组的开头转储所有字节到top 插槽的最后一个字节,或者我需要以相反的顺序转储 u64 元素?抱歉这个问题,我对字节序有点不了解
  • 如果要打印(所以 MSB 在前),从 top-1 开始到 0。在 C 语言中,您可以使用 printf("%02x", st.arr[i]);
  • @Matthieu 谢谢,我会尝试发布结果@chux-ReinstateMonica 老实说我不知道​​,它在库中定义为RSA_NUMBER_ARRAY_SZ,我认为这是因为这个库支持高达 1024 位密钥和 17 是存储这些密钥的最少 unsigned long long 数量
  • 不,你需要 16 个;毕竟他们没有签名。但是,在进行模运算时可能会出现一些溢出(我在这里猜测)。

标签: c cryptography rsa bigint


【解决方案1】:

谢谢@Matthieu!你的评论奏效了。 我需要以相反的顺序连接unsigned long longs,并由于字节顺序反转它们的字节。

按照他的解决方案,我实现了这个功能,效果很好:

void print_u1024(u1024_t number) {
    int size = (number.top + 1) * sizeof(u64);
    for (int i = size-1; i >= 0; i--) {
        printf("%02x", ((unsigned char*)number.arr)[i]);
    }
    printf("\n");
}

请注意,此解决方案可能仅适用于 little-endian 系统(大多数 PC)。

【讨论】:

  • 顺序可能依赖于字节序。在另一台机器上可能需要其他顺序。
  • 好的,我将编辑答案以使其清楚,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 2021-01-11
  • 1970-01-01
  • 2012-03-21
  • 2012-09-11
  • 1970-01-01
  • 2016-07-29
相关资源
最近更新 更多