我们学校的C++课程相当逆天,进度相当感人,在我开始写这篇帖子的今天他终于讲到选择语句了。为了完成这个大作业,我只好进行自学,遇到困难就问GPT。
我们组的C++大作业试图写一个采用RSA加密的加密程序,我是负责写程序的,突发奇想发个帖子记录一下。
2023.11.10
这两天把程序的第一个模块写完了
首先,NPQ 类包含了一系列与素数、RSA算法相关的函数。在构造函数中,创建了一个名为 ss 的数组,用于存储素数的信息。
V 函数用于生成小于等于给定数 n 的所有素数,并将它们存储到 ss 数组中。
S 函数用于判断一个数是否为素数,并将结果存储到 ss 数组中。该函数中使用了一个布尔变量 P 来表示是否为素数,然后根据具体的判断逻辑来更新 ss 数组中的值。
K 函数用于调用 V 函数生成素数序列,如果输入的数不符合条件则输出错误信息。
O 函数用于计算两个最大的素数 P 和 Q,然后计算出 N 和 L。
ES 函数用于寻找与 L 互素的 E 值。
gcd 函数用于计算最大公约数,实际上是一个递归函数。
DS 函数用于计算 D 的值,用于 RSA 加密算法。
在主函数 main 中,首先输入一个整数 n,然后创建 NPQ 类的对象 NN,并依次调用 K 和 O 函数,最后输出 N 的值。
总体来说,这个程序实现了一个简单的 RSA 加密算法,并且通过 NPQ 类封装了与素数相关的计算操作。这些函数相互调用,完成了整个 RSA 加密算法第一部分所需的一系列计算过程。
下面是现在有的程序,亲测能跑;从上到下分别是头文件,函数内容,主程序
#pragma once
#include<iostream>
#include <vector>
using namespace std;
class NPQ
{
private:
int P, Q;
long long L, E, D;
public:
long long N;
int n;
NPQ(int n);
vector<long>ss;
int V(int);
int S(int);
int K(int);
int O(int);
int ES(long long);
int DS();
bool gcd(long long, long long);
#include "NPQ.h"
#include<iostream>
using namespace std;
int NPQ:: V(int n)
{
for (int i = 2; i <= n; i++)
{
NPQ::S(i);
}
return 0;
}
int NPQ::S(int i)
{
if (i == 2)
{
NPQ::ss[2] = 2;
}
else
{
for (int k = 2; k <=(i + i % 2) / 2; k++)
{
if (NPQ::ss[k] == 0)
{
continue;
}
else
{
if ((i % (NPQ::ss[k])) == 0)
{
ss[i] = 0;
return 0;
}
}
}
NPQ::ss[i] = i;
}
return 0;
}
int NPQ:: K(int n)
{
if (n < 3|| n > 10000)
cout << "error" << endl;
else
{
NPQ::V(n);
}
return 0;
}
int NPQ::O(int n)
{
int QQ = 0;
int M = 0;
for ( M = n; QQ < 2; M--)
{
if (NPQ::ss[M] != 0)
{
QQ++;
if (QQ == 1)
NPQ::P = ss[M];
if (QQ == 2)
NPQ::Q = ss[M];
}
}
NPQ::N = P * Q;
NPQ::L = (P - 1) * (Q - 1);
return 0;
}
int NPQ::ES(long long L)
{
for (E = 2; E < L; E++)
{
bool PP=NPQ::gcd(E, L);
if (PP == true)
break;
}
return 0;
}
bool NPQ::gcd(long long E, long long L)
{
if(E==0||L==0)
{
if ((E + L) == 1)
{
return true;
}
else
return false;
}
long long BC = L % E;
L=E;
E=BC;
NPQ::gcd(E,L);
return true;
}
int NPQ::DS()
{
for (long long r = 1; r < E; r++)
{
if (((r * L) + 1) % E == 0)
{
D = (r * L + 1) / E;
break;
}
}
return 0;
}
NPQ::NPQ(int n): ss(n + 1, 0)
{
this->n = n;
}
#include<iostream>
using namespace std;
#include"NPQ.h"
int main()
{
int n = 0;
cin >> n;
NPQ NN(n);
NN.K(n);
NN.O(n);
cout << NN.N << endl;
return 0;
}
光棍节的凌晨突发奇想写了个要用到的函数
#pragma once
#include<iostream>
long long power(long long P, int t)
{
if (t==1)
{
return P;
}
else if (t % 2 == 0)
{
long long temp = power(P, t / 2);
P = temp * temp;
}
else
{
P = P * power(P, t - 1);
}
}
long long bigpower(long long code, long long E,long long N)
{
long long temp=1;
int t=1, u=0;
for (t = 1; t<=E; t++)
{
temp = (temp * code) % N;
}
return temp;
}
等我睡一觉明天看看能跑不,我感觉问题不大捏。
今天是11.12
终于开始写加密部分了哈哈哈哈
#pragma once
#include<iostream>
#include"NPQ.h"
#include<string>
#include"bigpowerModN.h"
string tans(string &lightode,long long E,long long N)
{
string combine = "", RSAcode ="", temp = "";
long long Tem = 0;
for (char c : lightode)
{
combine += to_string(int(c));
}
int i = 0;
for (;((N - 2)*(i + 1))< lightode.length();i++)
{
temp = combine.substr((N - 2) * (i),N-2);
Tem = stoi(temp);
Tem=bigpowerModN(Tem, E, N);
RSAcode = RSAcode+to_string(Tem).insert(0, "X")+"X";
}
temp = combine.substr((N - 2) * i);
Tem = stoi(temp);
Tem = bigpowerModN(Tem, E, N);
RSAcode = RSAcode + to_string(Tem).insert(0, "X") + "X";
return RSAcode;
}