c++ - RSA 解密产生错误结果
问题描述
我正在尝试实施 RSA 加密,每当实施解密部分时,我都会得到错误的答案。
加密之前的所有内容都给了我正确的值:n 是 187,phi 是 160,e 是 3,私钥 d 是 107,密文 c 是 183。然后,我首先计算 c^d(这给了我 -9223372036854775808 ) 然后对该结果执行 mod(n) 以获得 -162(假定解密)。
我认为错误出现在 c^d 部分,但我无法确定出了什么问题。任何帮助,将不胜感激。
int main()
{
long p = 11;
long q = 17;
long n = p * q;
double phi = (p-1) * (q-1);
int e = 3;
while(e < phi) {
if(GCD(e, phi) == 1) break; //GCD is a function that returns the GCD
else e++;
}
int k = 2;
// private key computation
double d = (1+(k*phi))/e;
double msg = 72;
long c = pow(msg, e);
// c mod(n)
c %= n;
long decr = pow(c, d);
decr %= n;
return 0;
}
解决方案
您可以使用以下代码来计算模数(O(n)
复杂度)
//Compute a^b mod n
int powermod(int a, int b, int n) {
int result = 1;
for (int i=1;i<=b;++i) {
result *= (a%n);
result %= n;
}
return result%n;
}
您可以以类似于计算指数模的方式修改快速功率。它使用以下公式
a^b mod n = (a mod n)^b mod n
推荐阅读
- selenium - 无法读取未定义的属性“defaultView”
- c++ - 在 Visual Studio 2019 中添加服务引用
- physx - 需要获得对象/身体的位置
- razor - cshtml.cs 中的 GoTo 函数转到 cshtml 页面
- javascript - 搜索过滤器不适用于 setState 上的反应表:React JS
- javascript - 如何在 create-react-app 中添加外部 js 库
- node.js - Laravel 框架适合短信群发应用吗
- python - 将字典中的值从 str 转换为 float
- c++ - 在 C++ STL 的映射中搜索键时,出现以下错误
- url - 如何在 .NET Core 中本地化路由操作/控制器