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

📄 testmiracl.cpp

📁 一套关于大数运算函数库
💻 CPP
字号:
// TestMiracl.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
extern "C"
{
	#include "miracl.h"
	#include "mirdef.h"
}

int _tmain(int argc, _TCHAR* argv[])
{

miracl *mip = mirsys(400,10);	//初始化一个400位10进制的大数系统
big x,y,z;


	x = mirvar(177);
	y = mirvar(79);
	z = mirvar(0);
	divide(x, y, z);	//x=x mod y, z=x/y

	cotnum(x,stdout);	//x=19
	cotnum(y,stdout);	//y=79
	cotnum(z,stdout);	//z=2

	multiply(x, y, z);	//z=x*y
	mip->IOBASE=16;		//将原来的10进制改为16进制模式
	cotnum(z, stdout);	//5DD

/*  测试13^-1 mod 2436 = 937
	x = mirvar(13);
	y = mirvar(2436);

	xgcd(x, y, z, z, z);	
	std::cout<<"z=";
	cotnum(z, stdout);	
*/

	mirkill(x);			//释放大数变量
	mirkill(y);
	mirkill(z);

	//========================================================
	//下面进行RSA算法加密和解密运算
char OutStr[500];
char mStr[]="Computer";

	big m=mirvar(0); //m 明文
	big c=mirvar(0); //c 密文

	big p=mirvar(0); //大素数p
	big q=mirvar(0); //大素数q

	big n=mirvar(0); //n 模数
	big pn=mirvar(0); //欧拉函数值pn = (p - 1)(q - 1)

	big d=mirvar(0); //d 私钥
	big e=mirvar(0); //e 公钥


	mip->IOBASE=10;		//将原来的16进制改为10进制模式

	expb2(500, p);		//计算2的500次方, 2^1024 ~= 1.8 * 10^308
	nxprime(p, p);		//找一个比2的500次方大的素数
	std::cout<<"p=";
	cotnum(p, stdout);	
	
	//还是测试一下是否为素数
	if ( isprime(p) ) std::cout<<"p is a prime!"<<"\n";

	premult(p, 2, q);	//q=p*2
	nxprime(q, q);		//找一个比p*2大的素数
	std::cout<<"q=";
	cotnum(q, stdout);	
	//还是测试一下是否为素数
	if ( isprime(q) ) std::cout<<"q is a prime!"<<"\n";

	multiply(p, q, n);	//n = (p - 1)(q - 1)

	//以下计算欧拉函数值pn
	decr(p, 1, p);		//p = p - 1
	decr(q, 1, q);		//q = q - 1
	multiply(p, q, pn);	//pn = (p - 1)(q - 1)

	convert(65537, e);	//取e公钥为2的16次方加1
	//cinstr(e,"65537");	//取e公钥为2的16次方加1

	xgcd(e, pn, d, d, d);	//计算d = e^-1 mod n
	std::cout<<"d=";
	cotnum(d, stdout);	

	bytes_to_big(8, mStr, m);	//将8个字符的明文,转换成大数
	std::cout<<"m=";
	cotnum(m, stdout);	

	//加密
	powmod(m,e,n,c);			//计算c=m^e mod n
	std::cout<<"c=";
	cotnum(c, stdout);	


	//解密
	powmod(c,d,n,m);			//计算m=c^d mod n
	std::cout<<"m=";
	cotnum(m, stdout);	
	big_to_bytes(256,m,OutStr,FALSE);	//将m转换成数组写入temp
    OutStr[8] = '\0';
	std::cout<<"OutStr="<<OutStr<<"\n";



	mirkill(m);			//释放大数变量
	mirkill(c);

	mirkill(p);
	mirkill(q);

	mirkill(d);
	mirkill(e);

	mirkill(n);
	mirkill(pn);

	mirexit();

	return 0;
}

⌨️ 快捷键说明

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