密码学基础练习五道 RSA、elgamal、elgamal数字签名、DSA数字签名、有限域(GF)上的四则运算

d=rand()%eular;

x=pubKey*d%eular;

if(x==1)

{

return d;

}

}

}

//加密函数

void jiami()

{

str_read_len = strlen(str_read);//从参数表示的地址往后找,找到第一个’\0’,即串尾.计算’\0’至首地址的“距离”,即隔了几个字符,从而得出长度.

printf(“密文是:”);

for(int i=0;i<str_read_len;i++)

{

int C=1;

int a=str_read[i],b=a%mod;

for(int j=0;j<pubKey;j++)      //实现加密

{

C=(C*b)%mod;

}

str_encrypt[i]=C;

printf(“%d”,str_encrypt[i]);

}

printf(“\n”);

}

//解密函数

void jiemi()

{

int i=0;

for(i=0;i<str_read_len;i++)

{

int C=1;

int a=str_encrypt[i],b=a%mod;

for(int j=0;j<priKey;j++)

{

C=(C*b)%mod;

}

str_decrypt[i]=C;

}

str_decrypt[i]=‘\0’;

printf(“解密文是:%s\n”,str_decrypt);

}

//主函数

int main()

{

srand(time(NULL));

while (1)

{

prime1=randPrime();

prime2=randPrime();

printf(“随机产生两个素数:prime1=%d,prime2=%d”,prime1,prime2);

mod=prime1*prime2;

printf(“模数:mod=prime1*prime2=%d\n”,mod);

if(mod>Element_Max)

break;      //模数要大于每个加密单元的值

}

eular=(prime1-1)*(prime2-1);

printf(“欧拉数:eular=(prime1-1)*(prime2-1)=%d\n”,eular);

pubKey=randExponent();

printf(“公钥指数pubKey=%d\n”,pubKey);

priKey=inverse();

printf(“私钥指数:priKey=%d\n  私钥为(%d, %d)\n”, priKey, priKey, mod);

jiami();

jiemi();

return 0;

}


流程图:


![](https://img-blog.csdnimg.cn/direct/30c37fa204484d43abdc14e65fc5fec3.png)



2.elgamal



#include<stdio.h>

#include<stdlib.h>

#include<math.h>

//模重复平方算法,计算a^b mod p

int pow_mod(int a,int b,int p)

{

int ans=1;

int tmp=a%p;

while(b){

if(b&1)

ans=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值