我的RSA实现有什么问题?
Whats wrong with my RSA implementation
我写了一个RSA加密的小实现,但它没有给出正确的结果,有时在使用其他值为p &问(启动)。这里有什么问题吗?
#include <stdio.h>
#define uint unsigned long long
uint modpow(uint base,uint exp,uint modulus)
{
base %= modulus;
unsigned long long result = 1;
while (exp > 0) {
if (exp & 1) result = (result * base) % modulus;
base = (base * base) % modulus;
exp >>= 1;
}
return result;
}
uint modinv(uint a,uint p) {
uint ex = p-2, result = 1;
while (ex > 0) {
if (ex % 2 == 1) {
result = (result*a) % p;
}
a = (a*a) % p;
ex /= 2;
}
return result;
}
int main()
{
uint p = 4294967291;
uint q = 1073741789;
uint e = 3;
uint m = p*q;
uint phi = (p -1)*(q -1);
uint d = modinv(e,phi);
uint c = 0x41424344;
uint en = modpow(c,e,m);
printf("Encrypting: %llXnEncrypted: %llXnDecrypted: %llX",c,en,modpow(en,d,m));
}
一个问题是unsigned long long
可能只有64位,而中间的result*base
和base*base
很容易在modpow
函数中溢出64位。你需要一个__int128
中间类型(如果你的编译器支持的话)。
另一个问题是RSA仅适用于映射到非p或q的整数的明文/密文值。如果您选择的明文是p或q的倍数,则解密将失败。这不是现实(大)模的问题,因为随机击中p或q的倍数的可能性非常小(这与仅给定公钥猜测私钥的机会大致相同)。
第一个问题可能是什么让你悲伤。
相关文章:
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- c++无值sort()的问题是什么?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 基本的 c++ 问题:如果我在函数中创建某些内容并返回它会发生什么?
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 什么是钻石问题?是一系列问题还是特定问题?
- 格式说明符C++有什么问题
- 我应该在 main 函数中写什么来测试我的问题?
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 方法问题 - 什么会改变值,什么不会改变?什么是无效的?