我正在使用C语言编写RSA加密算法。我并不打算将其用于任何生产环境,主要是为了扩大我对加密的理解。
如何处理RSA生成的巨大数字?即使使用像103这样相对较小的私钥进行解密,我仍然面临处理类似以下内容的问题:
67^103 mod 143 = (1.21816096336830017301951805581 x 10^188) mod 143
存储这样大小的数字的最佳方法是什么?是否有使用标准库的方法?
我正在使用C语言编写RSA加密算法。我并不打算将其用于任何生产环境,主要是为了扩大我对加密的理解。
如何处理RSA生成的巨大数字?即使使用像103这样相对较小的私钥进行解密,我仍然面临处理类似以下内容的问题:
67^103 mod 143 = (1.21816096336830017301951805581 x 10^188) mod 143
存储这样大小的数字的最佳方法是什么?是否有使用标准库的方法?
错误的方法。不需要先计算67^103
,而是应该在循环中逐位计算指数。
每次循环计算一个比特位的模
值。
uint32_t powmod(uint32_t base, uint32_t expo, uint32_t mod) {
// % mod need only for the cases expo==0, mod<=1
uint32_t y = 1u % mod;
while (expo) {
if (expo & 1u) {
y = ((uint64_t) base * y) % mod;
}
expo >>= 1u;
base = ((uint64_t) base * base) % mod;
}
return y;
}
int main(void) {
printf("%lu",(unsigned long) powmod(67, 103, 143));
}
输出
89
67^103 mod 143
需要使用大型int
库。输入都小于等于8位,这里的一切都可以通过快速简单的整数运算来解决。 - chux - Reinstate Monica