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

📄 rsa.cpp

📁 这是一个RSA的简单实现算法,用的是C++语言实现的.
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "vlong.h"
#include "rsa.h"

//生成大奇数及 e m 
void MakePrime(long Level)
{
	private_key pkey;
	char prand[2][128],vername[5],tc;
	DWORD i,j,nn, nCount;
	vlong *tmp[4];
	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]); //计算生成两个大奇数 p, q
	
	tmp[0] = &pkey.p;
	tmp[1] = &pkey.q;
	tmp[2] = &pkey.e;
	tmp[3] = &pkey.m;
	strcpy(vername, "pqem");
	
	fp =  fopen("RSAVar.txt", "w");
	for(j=0; j<4; j++)
	{
		nn=tmp[j]->value->n;
		fprintf(fp, "[%c]\nLen = %d\n", vername[j], nn);
		for(i=0; i<nn; i++)
		{
			fprintf(fp,"%c[%ld] = 0X%08lX;\n", vername[j],i,  tmp[j]->value->a[i]);
		}
	}
	fclose(fp);
}

//以下p,q,e,m可由 本程序的 参数 p0生成,可任意改变
#define VL 8
// p, q 仅在加密程序中用
DWORD p[VL/2]   = {0Xb2ab9d39, 0X8e53d98d, 0X77dd8ec1,0X995283d6};
DWORD q[VL/2]   = {0Xc7e37a29, 0X7fb7c168, 0Xea61d2a3,0Xcaab6cd8};

// e, m 在加解密程序中都要
DWORD e       =  0X00010001;
DWORD m[VL] = {0X1ef45821,0X71a30c63,0Xe3a16b86,0Xce0e1e51
					,0X462d92c1,0X4ac42393,0X04749e17,0X7961c756};
//加密
void Encrypt()
{
	// 准备p.q.m.e
	private_key pkey;    //私匙类,数据保密
	pkey.p.load(p,VL/2);
	pkey.q.load(q,VL/2);
	pkey.e = e;
	pkey.m.load(m, VL);
	
	DWORD a[VL];

	//准备要加密的数,这里,只对两个DWORD值加密,卡号和计算机标识符
	//读入卡号和标识符框中的当前值
	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 中就保存有要加密的数
	
	//计算加密后的数c
	vlong c = pkey.decrypt(m);
	c.store(a, VL);

//以下只是对 VL == 8的情况的处理

	//由于pkey中的成员m,是一小于8个DWORD值的数,加密后的 c < pkey.m
	//所以,a[7]的高位总为0, 以防a[6],a[7]过多的高位为0,对a[7]变换处理一下
	a[7] ^= (a[1]+a[2]+a[3]+a[4]);
	a[6] ^= (a[0]+a[5]);
	//加密后的结果就是 a[0]-a[7]

	FILE *fp =  fopen("nwnb.txt", "w");
	if(fp != NULL)
	{
	fprintf(fp,"%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX\n", 
		a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
	fclose(fp);
	}

	printf("Encrypt Data:\n");
	printf("%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX\n", 
		a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}

void Decrypt()
{
	//准备 [m] [e], 解密只用到 m,e
	public_key pkey;     //公匙类,数据公开
	pkey.e = e;
	pkey.m.load(m, VL);

	DWORD a[VL];
	
	//读入加密后的VL个DWORD值到a可
	memset(a,0,VL*sizeof(long));
	FILE *fp =  fopen("nwnb.txt", "r");
	if(fp != NULL)
	{
	fscanf(fp,"%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX\n", 
		&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7]);
	fclose(fp);
	}
	//还原a[6],a[7]
	a[7] ^= (a[1]+a[2]+a[3]+a[4]);
	a[6] ^= (a[0]+a[5]);
	//加密的数据保存到m中
	vlong m;
	m.load(a,8);
	
	//计算加密前的数据,保存在c中
	vlong c = pkey.encrypt(m);
	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("欢迎访问乱站 -- http://com.6to23.com/ \n");
	printf("By: Seraph Chutium  2001.7.21 \n");
	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)
{
	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 + -