密码学课程设计-RSA

本文深入探讨了RSA密码体制的工作原理,包括公钥和私钥的生成,加密和解密过程。同时,阐述了其在网络安全中的重要应用,如数字签名和数据加密。通过实例解析,帮助读者理解RSA的安全性和实际操作。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<string.h>
#include<string>
using namespace std;


#define SIZE 33
#define MULSIZE 2*SIZE

typedef struct Bigint
{
   
	unsigned char num[SIZE];
}Bigint;

typedef struct Bigint2
{
   
	unsigned char num[2 * SIZE];
}Bigint2;


Bigint p = {
    0 };
Bigint q = {
    0 };
Bigint N = {
    0 };
Bigint PhiN = {
    0 };
Bigint e = {
    0 };
Bigint d = {
    0 };
Bigint m = {
    0 };
Bigint c = {
    0 };
Bigint m1 = {
    0 };


//初始化
Bigint Init(unsigned char str[], int length);
//复制
void Copy(Bigint& a, Bigint b);
//打印输出
void Print(Bigint a);
//打印输出并储存数组
void PrintNum(unsigned char* out, int& len, Bigint a);
//计算长度
int Length(Bigint a);
int Length(Bigint2 a);
//比较大小
int Compare(Bigint a, Bigint b); //a>b,a=b,a<b分别输出1,0,-1
int Compare(Bigint2 a, Bigint2 b);
//左移loop个字节
Bigint MoveLeft(Bigint a, int loop);
Bigint2 MoveLeft(Bigint2 a, int loop);
//右移一个比特
void BitMoveRight(Bigint& a);
//扩充数组
Bigint2 Extend(Bigint a);
//截断数组
Bigint Narrow(Bigint2 a);
//生成随机数
Bigint BigRand(Bigint n);
Bigint BigRandOdd(int bytes);

//基本运算
Bigint Add(Bigint a, Bigint b); // 加法,输入a,b, 返回a + b
Bigint2 Add(Bigint2 a, Bigint2 b); // 加法,输入a,b, 返回a + b
Bigint Sub(Bigint a, Bigint b); // 减法,输入a>b, 返回a - b
Bigint2 Sub(Bigint2 a, Bigint2 b); // 减法,输入a>b, 返回 a - b
Bigint2 Mul(Bigint a, Bigint b); // 乘法,输入a,b, 返回 a * b
Bigint Div(Bigint a, Bigint b); // 除法,输入a,b, 返回 a / b
Bigint Mod(Bigint a, Bigint b); // 求余,输入a,b, 返回 a % b

Bigint AddMod(Bigint a, Bigint b, Bigint n); // 模加: 输入a,b,模数n,返回 a + b mod n
Bigint SubMod(Bigint a, Bigint b, Bigint n); // 模减: 输入a>b,模数n,返回 a - b mod n
Bigint Sub2Mod(Bigint a, Bigint b, Bigint n); // 模减: 输入a,b,模数n,返回 a - b mod n
Bigint MulMod(Bigint a, Bigint b, Bigint n); // 模乘: 输入a,b,模数n,返回 a * b mod n
Bigint PowMod(Bigint a, Bigint b, Bigint n); // 模幂:输入a,b,模数n,返回 a ^ b mod n
Bigint GCD(Bigint a, Bigint b);              // 最大公因数:输入a,b, 返回gcd(a, b)
//MillerRabin素性检测
bool MillerRabinKnl(Bigint& n);              //单次MillerRabin素性检测
bool MillerRabin(Bigint& n, long loop);      //loop次MillerRabin素性检测

//生成字节数为bytes的素数
Bigint GenPrime(int bytes);
//生成公私钥
Bigint GenE(Bigint PhiN);
bool Inverse(Bigint e, Bigint N, Bigint& d);
//加密
Bigint Encrypt(Bigint m, Bigint e, Bigint n);
//解密
Bigint Decrypt(Bigint c, Bigint d, Bigint n);

Bigint Init(unsigned char str[], int length)
{
   
	Bigint res;
	if (length > SIZE)
	{
   
		length = SIZE;
	}
	int i;
	for (i = 0; i < length; i++)
		res.num[i] = str[length - 1 - i];
	for (i = length; i < SIZE; i++)
		res.num[i] = 0;
	return res;
}

void Copy(Bigint& a, Bigint b)
{
   
	for (int i = 0; i < SIZE; i++)
		a.num[i] = b.num[i];
}

void Print(Bigint a)
{
   
	int res[2000];

	int i = 0;

	Bigint b = {
    0 };
	Bigint c = {
    10 };
	while (Compare(a, b) == 1)
	{
   
		res[i] = Mod(a, c).num[0];
		a = Div(a, c);
		i++;
	}
	//cout << "该数字是:" << endl;
	for (int j = i - 1; j >= 0; j--)
	{
   
		//cout << res[j];
	}
	cout << endl;
}

void PrintNum(unsigned char* out, int& len, Bigint a)
{
   
	int i = 0;

	Bigint b = {
    0 };
	Bigint c = {
    10 };
	while (Compare(a, b
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要求:<br>1. 随机搜索大素数,随机生成公钥和私钥。<br>2. 用公钥对任意长度的明文(字符)加密。<br>3. 用私钥对密文解密。<br>4. 界面简洁、友好便于操作。<br>环境:<br>1. 硬件环境:PC机一台<br>2. 软件环境:Windos 2000/XP, VC++6.0<br>RSA算法原理:<br>1. 首先,找出两个大素数key_P,key_Q,令key_N = key_P * key_Q。根据欧拉(Euler)数(key_N)的定义为小于key_N且与key_N互素的正整数个数,如果key_P和key_Q的最大公约数GCD(key_P,key_Q)=1,则(key_N)=(key_P) *(key_Q),特别地,如果若key_P != key_Q且都是素数,则(key_N)=(key_P-1)*(key_Q-1)。这时,我们令key_Z = (key_N) = (key_P-1)*(key_Q-1)。并且,key_N公开,key_Z要保密。<br>2. 然后,选择一个与key_Z互素的整数key_D,作为解密密钥。Key_D公开。<br>3. 解同余方程key_E * key_D mod key_Z = 1。得到的key_E就是加密密钥。Key_E需要保密。<br>这个时候key_E一定存在。因为key_D和key_Z互素,根据欧几里德算法,GCD(key_D,key_Z) = 1,而扩展欧几里德算法key_D存在模key_Z乘法逆元的充分必要条件是GCD(key_D,key_Z) = 1。至于key_E怎么得到,用辗转相除法即可得到,下面还会就模key_Z的扩展欧几里德算法予以祥述。<br>4. 接着做加密和解密信息处理。发送端将要发送信息为key_P,通过key_C = key_P^key_E mod key_N 进行处理,然后将密文key_C 发到接受端。这时即使中途有人窃取信息,也只能得到密文,而且,窃取者很难通过公钥(key_N,key_E)对密文进行解密。这时接受端接受到密文。并通过密钥(key_N,key_D)进行解密处理:key_P = key_C^key_D mod key_N。<br><br>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值