【发布时间】:2023-03-22 02:55:02
【问题描述】:
#include <iostream>
#include <bits/stdc++.h>
#include <numeric>
using namespace std;
int
gcd (int a, int b)
{
if (a == 0)
return b;
return gcd (b % a, a);
}
int
phi (unsigned int n)
{
unsigned int result = 1;
for (int i = 2; i < n; i++)
if (gcd (i, n) == 1)
result++;
return result;
}
int
gen_priv_n (int p1, int p2)
{
int n = phi (p1) * phi (p2);
return n;
}
int
gen_pub_n (int p1, int p2)
{
int n = (p1 * p2);
return n;
}
int
gen_priv_key (int n, int e)
{
int x = (phi (e) * n + 1) / e;
return x;
}
int
encrypt (int n, int e, int data)
{
int crypt_data = int (pow (data, e)) % n;
return crypt_data;
}
int
decrypt (int c, int d, int n)
{
int data = int (pow (c, d)) % n;
return data;
}
int
main ()
{
int ph1 = 53;
int ph2 = 59;
int e = 3;
int message = 89;
int pub_n = gen_pub_n (ph1, ph2);
cout << "PUBN " << pub_n << "\n";
int priv_n = gen_priv_n (ph1, ph2);
cout << "PRIVN " << priv_n << "\n";
int d = gen_priv_key (gen_priv_n (ph1, ph2), e);
cout << "PRIVKEY " << d << "\n";
int c = encrypt (pub_n, e, message);
cout << "ENCRYPTED " << c << "\n";
int data = decrypt (c, d, pub_n);
cout << "MESSAGE " << data;
}
PUBN、PRIVN、PRIVKEY 和 ENCRYPTED 都返回预期的数字,但是,解密函数应该返回 89(消息变量),但没有返回。我假设操作代码顺序存在算术错误,但我不确定。可以指出问题吗?
变量的结果是:
- PUBN 3127
- PRIVN 3016
- PRIVKEY 2011
- 加密 1394
- MESSAGE -763
【问题讨论】:
-
去掉非标准的
bits标头和using namespace std;。已经有一个gcd C++ 函数,并且在程序中包含所有这些内容将很容易让程序的行为与预期不同。 -
看起来
pow(1394, 2011)远远超出了int可以存储的范围。您需要在进行指数计算时继续应用模数以避免溢出。 -
至于什么是错误的,假设它应该是基于整数的程序被破坏了。它被破坏了,因为你使用了一个浮点函数
pow,一旦你这样做了,所有关于基于整数的程序将产生什么结果的赌注都没有了。如果您在pow函数中使用了较小的值,情况也是如此。 -
@NathanPierson 我该怎么做?使用 for 循环?
-
如果你想玩密码学,开始学习 GNU/GMP
标签: c++ encryption cryptography public-key-encryption