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

📄 main.cpp

📁 RSA加密解密源码
💻 CPP
字号:
//***************************************************************
//
//  这是RSA一个比较完整的版本,包含有生成密钥和加、解密
//  这个程序经过了Hoohoo的改造,由BC3.1编译通过
//  虽然可以运行,不过本人觉得还是效率比较低,可能是vlong
//  的问题吧!
//                                             2003.3.27
//***************************************************************




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>
#include "vlong.h"
#include "rsa.h"


char *Key_file="rsavar.txt";
int VL;
//*****************************************************************
//生成密钥对,包括公钥e,m和私钥d,m ,生成的数据放在同一个文件里面
//我现在还没有考虑密钥发行的问题
//如果你觉得有必要,就改一下,放到两个文件里面去吧
//至于level起什么作用,麻烦你看看程序
//*****************************************************************
void MakePrime(long Level)
{
	private_key pkey;
	char prand[2][128],vername[3],tc;
	DWORD i,j,nn, nCount;
	vlong *tmp[3];
	FILE *fp;

	srand((unsigned)time(NULL));    //产生随机数,当然设个种子先   
	if(Level == '1')                //生成512位
		nCount = 32;
	else if(Level == '2')           //生成1024位
		nCount = 64;
	else                            //生成256位
		nCount = 16;
                                        //先产生两个大的随机数
	for(i=0; i<2; i++)
	{
		for(j=0; j<nCount; j++)
		{
			tc = (char)(0x41+rand()%0xAF);   //这是什么意思
			prand[i][j] = tc;
		}
		prand[i][j]=0;
	}
                                         
	pkey.create(prand[0], prand[1]); //公钥、私钥一次搞掂

	tmp[1] = &pkey.e;                //把他们写到一个文件里面去
	tmp[2] = &pkey.d;
	tmp[0] = &pkey.m;
	strcpy(vername, "med");

	fp =  fopen(Key_file, "w");
	for(j=0; j<3; j++)
	{
		nn=tmp[j]->value->n;
		fprintf(fp, "[%c]\n%d\n", vername[j], nn);
		for(i=0; i<nn; i++)
		{
			fprintf(fp,"%08lX\n",tmp[j]->value->a[i]);
		}
	}
	fclose(fp);                      //打完收工!
}

//*************************************************
// 不知道叫什么名字好:)
// 功能就是到密钥文件中间去找你要的密钥
// 返回密钥长度并将文件指针指向数据开始的地方
//*************************************************
int find_string_head(unsigned char c,FILE *fp)
{
unsigned char tc;
int len;
tc=' ';
while(1)
{
	while(tc!='[' && !feof(fp)) tc=fgetc(fp);
	if(feof(fp)) return 0;
	tc=fgetc(fp);
	if(tc==c) break;
}
while(tc!=0x0a) tc=fgetc(fp);
fscanf(fp,"%d\n",&len);
return len;
}

//***********************************************
// 从密钥文件中间读取指定的密钥,并返回密钥长度
// c就是指定的密钥标志
// 返回的密钥在nu里面
//***********************************************
int get_vlong(char c,vlong *nu)
{
FILE *fp;
char tc;
int len,i;
DWORD temp[64];
fp=fopen(Key_file,"r");
len=find_string_head(c,fp);
if(len==0) {fclose(fp);return 0;}
for(i=0;i<len;i++)
	{
	fscanf(fp,"%8lx\n",temp+i);
	}
nu->load(temp,len);
return len;
}

//***********************************************
// 这个就是用私钥编码
// 不要去看名字,认为是编码就对了
//***********************************************
vlong _Encrypt(vlong m)
{
private_key pkey;
VL=get_vlong('m',&pkey.m);
get_vlong('d',&pkey.d);
return pkey.decrypt(m);
}

//***********************************************
// 这个是用公钥编码
//***********************************************
vlong _Decrypte(vlong c)
{
public_key pkey;
VL=get_vlong('m',&pkey.m);
get_vlong('e',&pkey.e);
return pkey.encrypt(c);
}


//**********************************************
// 下面的东东都是怎么用的演示了
//**********************************************

void Encrypt()
{
	int i;
	DWORD a[64];
	public_key pkey;

	VL=get_vlong('m',&pkey.m);   //取得密钥的长度
	memset(a,0,VL*sizeof(DWORD));
	printf("Please Input CardNo & PCID (Fmt %%X-%%X):\n");
	scanf("%lX-%lX",&a[0], &a[1]);
	vlong m;
	m.load(a, 2); //这样 m 中就保存有要加密的数
	vlong c = _Encrypt(m);
	c.store(a, VL);

	FILE *fp =  fopen("nwnb.txt", "w");
	if(fp != NULL)
	{
	for(i=0;i<VL;i++)
		{
		fprintf(fp,"%08lX\n",a[i]);
		}
	fclose(fp);
	}
}



void Decrypt()
{
	int i;
	public_key pkey;
	VL=get_vlong('m',&pkey.m);
	DWORD a[64];
	memset(a,0,VL*sizeof(long));
	FILE *fp =  fopen("nwnb.txt", "r");
	if(fp != NULL)
	{
	for(i=0;i<VL;i++)
		{
		fscanf(fp,"%08lX\n",&a[i]);
		}
	fclose(fp);
	}
	//加密的数据保存到m中
	vlong m;
	m.load(a,VL);

	//计算加密前的数据,保存在c中
	vlong c=_Decrypte(m);
		//下面两句话仅仅是特定的情况,其实长度不应该是2的
	memset(a,0,8*sizeof(long));
	c.store(a,2);

	// a[0], a[1]就是加密前的数据
	printf("Decrypt Data:\n");
	printf("%08lX-%08lX\n", a[0], a[1]);
}

void Help()
{
	printf("Usage:  Work  P0                  准备256位的加解密\n");
	printf("Usage:  Work  P1                  准备512位的加解密\n");
	printf("Usage:  Work  P2                  准备1024位的加解密\n");
	printf("Usage:  Work  E                   加密\n");
	printf("Usage:  Work  D                   解密\n");
}

void main(int nArg, char **sArg)
{
vlong num;
int len;
MakePrime('2');
Encrypt();
printf("\nok\n");
Decrypt();
getch();
/*
	if(nArg < 2)
	{
		Help();
		return;
	}

	if(sArg[1][0] == 'P' || sArg[1][0] == 'p')
	{
		MakePrime(sArg[1][1]);
		return;
	}
	else if(sArg[1][0] == 'E' || sArg[1][0] == 'e')
		Encrypt();
	else if(sArg[1][0] == 'D' || sArg[1][0] == 'd')
		Decrypt();
	else
		Help();
*/
}

⌨️ 快捷键说明

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