📄 testmiracl.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 + -