一.实验报告
二.代码
extern "C"
{
#include "miracl.h"
}
#include<stdio.h>
#include<math.h>
#include<string.h>
miracl *mip = mirsys(2000, 10);
big p_a, g_a, a_a, miu_p_a, g_a_a;
void produce(){
big temp_1, save;
temp_1 = mirvar(1);
save = mirvar(0);
while(1){
incr(g_a, 1, g_a);
powmod(g_a, miu_p_a, p_a, save);
if(compare(save, temp_1) == 0) break;
}
return;
}
int main(){
p_a = mirvar(0);
g_a = mirvar(1);
a_a = mirvar(0);
miu_p_a = mirvar(0);
g_a_a = mirvar(0);
big m;
char str[500];
m = mirvar(0);
printf("请输入m的值:");
gets(str);
cinstr(m,str);
while(1){
int flag = 0;
bigdig(150, 10, p_a);
if(isprime(p_a)) {
add(p_a, p_a, p_a);
incr(p_a, 1, p_a);
if(isprime(p_a))flag = 1;
}
if(flag)break;
}
decr(p_a, 1, miu_p_a);
produce();
bigdig(150, 10, a_a);
powmod(g_a, a_a, p_a, g_a_a);
printf("p = ");
cotnum(p_a, stdout);
printf("g = ");
cotnum(g_a, stdout);
big k, temp1;
temp1 = mirvar(1);
k = mirvar(0);
while(1){
bigrand(miu_p_a, k);
if(compare(k, temp1) != -1) break;
}
printf("k = ");
cotnum(k, stdout);
big c1;
c1 = mirvar(0);
powmod(g_a, k, p_a, c1);
printf("c1 = \n");
cotnum(c1, stdout);
big c2;
c2 = mirvar(0);
powmod(g_a_a,k,p_a,c2);
multiply(m, c2, c2);
powmod(c2,temp1,p_a,c2);
printf("c2 = \n");
cotnum(c2, stdout);
big v,m_jie;
v = mirvar(0); m_jie = mirvar(0);
powmod(c1,a_a,p_a, v);
xgcd(v, p_a, v, v, v);
multiply(c2, v, m_jie);
powmod(m_jie,temp1,p_a,m_jie);
if(compare(m_jie, m) == 0){
printf("is same\n");
} else {
printf("is not same\n");
}
return 0;
}