⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa.cpp

📁 RSA加密解密BMP图象,并用pollord算法对其进行分析,能够成功加密图象
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

long int E_KEY;
long int D_KEY;
unsigned long int N;
unsigned long int PN;


/*
  函数作用:将十进制数用二进制表示
  参数:十进制数
  返回值:转换成二进制的数组
*/
int *ten_to_two(unsigned long int m)
{
	int *array;
	unsigned long int i, k;
	array = new int[1024];

	i = 0;
	k = m;
	while(k != 0)
	{
		array[i] = (k % 2);
		k = k / 2;
		i++;
	}
	array[i] = 2;
	return array;
}


/*
  函数作用:快速指数算法
  参数:指数变成二进制表示的数组, 底数
  返回值:计算的出的结果
*/
unsigned long int pow(int *array, unsigned long int a)
{
	unsigned long int d = 1;
	int i = 0, k;
	while(array[i] != 2)
		i++;
	k = i;
	for(i = k - 1;i >= 0;i--)
	{
		d = (d * d) % N;
		if(array[i] == 1)
			d = (d * a) % N;
	}
	return d;
}



/*
  函数作用:素数判断
  参数:要进行判断的素数
  返回值:是否是素数的标志
*/
int judge_prime(unsigned long int prime)
{
	unsigned long int k, i;
	int flag = 1;

	k = unsigned long int(sqrt((double)prime));
	for(i = 2;i < k;i++)
	{
		if((prime % i) == 0)
		{
			flag = 0;
			return flag;
		}
	}
	return flag;
}

int gcd(int a, int n)
{
	int i;
	if(n % a == 0)
		return a;
	else
	{
		i = 1;
		while(1)
		{
			i++;
			if((a % i == 0) && (n % i == 0))
				return i;
			else if(i > 1 + (int)(sqrt((double)a)))
				return -1;
		}
	}
}


/*
  函数作用:产生公钥和私钥
  参数:无
  返回值:无
*/
void make_key()
{
	unsigned long int p, q, i, j;
	char string[12];
	int flag = 0, k = 0;

	p = q = 0;
	srand(time(NULL));

	while(flag != 1)
	{
		p = rand() % 256;
		flag = judge_prime(p);
	}
	
	flag = 0;
	while(flag != 1)
	{
		q = rand() % 256;
		flag = judge_prime(q);
	}

	N = p * q;
	i = 0;

	PN = (p - 1) * (q - 1);

	cout<<"请输入构造密钥的字符(11位例如:tangtaishan):"<<endl;
	cin>>string;
	for(i = 0;i < 11;i++)
	{
		k += (int)string[i];
		k = (k * k +1) % 256;
		flag = gcd(k, PN);
		if(flag == -1)
			break;
	}
	E_KEY = k;
	j = 2;
	i = (E_KEY * j) % PN;
	while(i != 1)
	{
		j += 1;
		i = (E_KEY * j) % PN;
	}
	D_KEY = j;

}

/*
  函数作用:rsa加密算法
  参数:无 
  返回值:无
*/
void rsa_encrytion()
{
	FILE *fp1, *fp2;
	
	unsigned long int all = 0;
	unsigned char str1[8], str2[16];
	int *array, i, j;
	unsigned char head[66];
	

	fp1 = fopen("5.bmp", "rb");
	fp2 = fopen("15.bmp", "wb");
	fread(head, sizeof(unsigned char), 66, fp1);

	fwrite(head, sizeof(unsigned char), 66, fp2);

	make_key();
	array = ten_to_two(E_KEY);
	fread(str1, sizeof(unsigned char), 8, fp1);
	while(!feof(fp1))
	{
		for(i = 0;i < 8;i++)
		{
			if(str1[i] < 0)
				str1[i] = str1[i] + 256;
			all = pow(array, (unsigned long int)str1[i]);
			str2[2 * i] = (unsigned char)(all % 100);
			str2[2 * i + 1] = (unsigned char)(all / 100);	
		}
		for(j = 0;j < 8;j++)
			str1[j] = str2[j];
		fwrite(str1, sizeof(unsigned char), 8, fp2);
		for(j = 8;j < 16;j++)
			str1[j - 8] = str2[j];
		fwrite(str1, sizeof(unsigned char), 8, fp2);
		fread(str1, sizeof(unsigned char), 8, fp1);
	}

	fclose(fp1);
	fclose(fp2);
}


/*
  函数作用:rsa解密算法
  参数:无
  返回值:无
*/
void rsa_distion()
{
	FILE *fp1, *fp2;

	unsigned long int all = 0;
	unsigned char str1[8], str2[8];
	int *array, i;

	unsigned char head[66];
	

	fp1 = fopen("15.bmp", "rb");
	fp2 = fopen("1115.bmp", "wb");

	fread(head, sizeof(unsigned char), 66, fp1);

	fwrite(head, sizeof(unsigned char), 66, fp2);

	
	
	
	array = ten_to_two(D_KEY);
	fread(str1, sizeof(unsigned char), 8, fp1);
	while(!feof(fp1))
	{
		for(i = 0;i < 4;i++)
		{
			all = str1[2 * i + 1] * 100 + str1[2 * i];
			all = pow(array, all);
			str2[i] = (unsigned char)all;
		}
		fread(str1, sizeof(unsigned char), 8, fp1);
		for(i = 0;i < 4;i++)
		{
			all = str1[2 * i + 1] * 100 + str1[2 * i];
			all = pow(array, all);
			str2[4 + i] = (unsigned char)all;
		}
		fwrite(str2, sizeof(unsigned char), 8, fp2);
		fread(str1, sizeof(unsigned char), 8, fp1);
	}

	fclose(fp1);
	fclose(fp2);
}

void main()
{
	rsa_encrytion();
	rsa_distion();

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -