【发布时间】:2020-07-26 13:19:32
【问题描述】:
我正在审查一个大学项目的应用程序的安全性,该应用程序使用 RSA 加密文件,特别是它使用这个库:https://github.com/ilansmith/rsa(不要使用它,它有严重的漏洞)。
(如果你想看一看,这些数字之间的大部分操作都是在rsa_num.c文件中实现的。)
此工具使用 unsigned long long 的数组来存储 RSA 所需的大数字(n、e 和 d):
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