大一编程新手完成C++大作业之RSA加密分享记录

我们学校的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;
}


 

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第一次作业 这个作业将让你去练习建立一些简单的类和使用C++的基本功能,包括:封装,引用,动态内存开辟, 简单构造函数和析构函数和const。 下面给的程序片段未经过编译或调试. 做出合理的错误修正是你任务的一部分。 一般的,我们会给你最基本部分的代码,如果你需要,你可以在一个类里添加额外的变量或方法,这个作业被分为三个部分,那么你们要按照步骤一步一步地完成。 1. 设计要求 第一部分) 构建简单的类 R1.1) 创建一个Person类, 其模型在下面的代码结构里。 R1.2) 人类(Persons)应该有一些属性: name, email_address, birthdate 作为表示人类的属性。 R1.3) 按下面的要求创建一个Date类。 R1.4) 每个类都应该可以使用输出运算符(<<)输出内容。 //file Date.h class Date { public: Date(); Date( int year, int month, int day ); ... private: int _year; int _month; int _day; }; //end file Date.h //file Person.h class Person { public: Person(void); Person(char * their_name, char * email, int day, int month, int year); char * GetName(); char * GetEmailAddress(); Date GetBirthDate(); void Print(); private: char* name; char* email_address; Date date; }; //end file Person.h 第二部分) 构建一个容器类 Set container. R2.1) 建立一个set的模型PersonSet类, 并且它只能保存Person的对象. R2.2) 这个set应该存储person的地址(指针),以便可以获取原始对象(非拷贝). R2.3) set的存储应该用动态数组来保存Person的指针(用new来创建), 但是set不应该有界限(数组大小), 它们应该在成员进行添加或移除时,适当进行扩展.. R2.4) 成员不按任何特定顺序存储(无排序). R2.5) set允许存储副本(相同对象). R2.6) Add() 函数应该当在添加的时候,并且需要的情况,进行扩展数组大小并且输出一串信息. R2.7) Remove() 函数应该在移除的时候, 并且在需要的情况, 可以进行缩小数组大小并输出一串信息. R2.8) Add() 函数应该带一个引用类型的参数(Person&). R2.9) 迭代应该通过NextElement()函数来提供. R2.10) NextElement()和 RemoveElement() 应该通过引用返回 对于现在我们将去建立sets去只保存Person对象,因此类名是PersonSet. //file PersonSet.h class PersonSet { public: //default constructor allocate appropriate heap storage store elements on //heap array declared like this: new Person*[initial_size]; PersonSet (int initial_size = 4); //store element in the set if the set is full allocate more memory ~ PersonSet (void); public: void Add(Person & element) ; Person & NextElement() ; // 从set中移除最后一个成员 //如果Set空的数据超过一半,释放一些内存 Person & RemoveElement(); // 从Set中的index索引处移除成员 // 如果Set空的数据超过一半, 释放一些内存 Person & RemoveElement( int index ); int Size(); //answer the number of elements in the set. void Print();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值