本文目录一览:
如何用C语言实现RSA算法?
上学期交的作业,已通过老师在运行时间上的测试\x0d\x0a#include \x0d\x0a#include \x0d\x0a\x0d\x0aunsigned long prime1,prime2,ee;\x0d\x0a\x0d\x0aunsigned long *kzojld(unsigned long p,unsigned long q) //扩展欧几里得算法求模逆\x0d\x0a{\x0d\x0aunsigned long i=0,a=1,b=0,c=0,d=1,temp,mid,ni[2];\x0d\x0amid=p;\x0d\x0awhile(mid!=1)\x0d\x0a{\x0d\x0awhile(pq)\x0d\x0a{p=p-q;mid=p;i++;}\x0d\x0a a=c*(-1)*i+a;b=d*(-1)*i+b;\x0d\x0atemp=a;a=c;c=temp;\x0d\x0atemp=b;b=d;d=temp;\x0d\x0atemp=p;p=q;q=temp;\x0d\x0ai=0;\x0d\x0a}\x0d\x0ani[0]=c;ni[1]=d;\x0d\x0areturn(ni);\x0d\x0a}\x0d\x0a\x0d\x0aunsigned long momi(unsigned long a,unsigned long b,unsigned long p) //模幂算法\x0d\x0a{\x0d\x0aunsigned long c;\x0d\x0ac=1;\x0d\x0aif(ap) a=a%p;\x0d\x0aif(bp) b=b%(p-1);\x0d\x0awhile(b!=0)\x0d\x0a{\x0d\x0awhile(b%2==0)\x0d\x0a{\x0d\x0ab=b/2;\x0d\x0aa=(a*a)%p;\x0d\x0a}\x0d\x0ab=b-1;\x0d\x0ac=(a*c)%p;\x0d\x0a}\x0d\x0areturn(c);\x0d\x0a}\x0d\x0a\x0d\x0avoid RSAjiami() //RSA加密函数\x0d\x0a{\x0d\x0aunsigned long c1,c2;\x0d\x0aunsigned long m,n,c;\x0d\x0an=prime1*prime2;\x0d\x0asystem("cls");\x0d\x0aprintf("Please input the message:\n");\x0d\x0ascanf("%lu",m);getchar();\x0d\x0ac=momi(m,ee,n);\x0d\x0aprintf("The cipher is:%lu",c);\x0d\x0areturn;\x0d\x0a}\x0d\x0a\x0d\x0avoid RSAjiemi() //RSA解密函数\x0d\x0a{\x0d\x0aunsigned long m1,m2,e,d,*ni;\x0d\x0aunsigned long c,n,m,o;\x0d\x0ao=(prime1-1)*(prime2-1);\x0d\x0an=prime1*prime2;\x0d\x0asystem("cls");\x0d\x0aprintf("Please input the cipher:\n");\x0d\x0ascanf("%lu",c);getchar();\x0d\x0ani=kzojld(ee,o);\x0d\x0ad=ni[0];\x0d\x0am=momi(c,d,n);\x0d\x0aprintf("The original message is:%lu",m);\x0d\x0areturn;\x0d\x0a}\x0d\x0a\x0d\x0avoid main()\x0d\x0a{unsigned long m;\x0d\x0achar cho;\x0d\x0aprintf("Please input the two prime you want to use:\n");\x0d\x0aprintf("P=");scanf("%lu",prime1);getchar();\x0d\x0aprintf("Q=");scanf("%lu",prime2);getchar();\x0d\x0aprintf("E=");scanf("%lu",ee);getchar();\x0d\x0aif(prime1
RSA加密解密算法示例(C语言)
#include stdlib.h
#include stdio.h
#include string.h
#include math.h
#include time.h
#define PRIME_MAX 200 // 生成素数范围
#define EXPONENT_MAX 200 // 生成指数e范围
#define Element_Max 127 // 加密单元的最大值,这里为一个char, 即1Byte
char str_read[100]="hello world !"; // 待加密的原文
int str_encrypt[100]; // 加密后的内容
char str_decrypt[100]; // 解密出来的内容
int str_read_len; // str_read 的长度
int prime1, prime2; // 随机生成的两个质数
int mod, eular; // 模数和欧拉数
int pubKey, priKey; // 公钥指数和私钥指数
// 生成随机素数,实际应用中,这两个质数越大,就越难破解。
int randPrime()
{
int prime, prime2, i;
next:
prime = rand() % PRIME_MAX; // 随机产生数
if (prime = 1) goto next; // 不是质数,生成下一个随机数
if (prime == 2 || prime == 3) return prime;
prime2 = prime / 2; // prime=4, prime2 的平方必定大于 prime , 因此只检查小于等于prime2的数
for (i = 2; i = prime2; i++) // 判断是否为素数
{
if (i * i prime) return prime;
if (prime % i == 0) goto next; // 不是质数,生成下一个随机数
}
}
// 欧几里德算法,判断a,b互质
int gcd(int a, int b)
{
int temp;
while (b != 0) {
temp = b;
b = a % b;
a = temp;
}
return a;
}
//生成公钥指数,条件是 1 e 欧拉数,且与欧拉数互质。
int randExponent()
{
int e;
while (1)
{
e = rand() % eular; if (e EXPONENT_MAX) break;
}
while (1)
{
if (gcd(e, eular) == 1) return e; e = (e + 1) % eular; if (e == 0 || e EXPONENT_MAX) e = 2;
}
}
//生成私钥指数
int inverse()
{
int d, x;
while (1)
{
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;
}
如何用C语言程序实现RSA算法?
#include "stdafx.h"
#includemath.h
#includestdio.h
int isP(int m)
{
int i;
for(i=2;im;i++)
if(m % i==0)return 0;
return 1;
}
int num(int m,int k)
{
int i=0;
for(m=m;k0;m++)
if(isP(m))
{
k--;
return m;
}
}
int main(int argc, char* argv[])
{
int P,Q,E,D,i,k,fn,c=0,j=0,t=1,f1=1,l=2;
int a[10];
long N0,N1;
long PT,CT,N;
printf("请输入第一个数:");
scanf("%d",P);
P=num(P,1);
printf("请输入比第一次大的数:");
scanf("%d",Q);
Q=num(Q,1);
N=P*Q;
N1=(P-1)*(Q-1);
N0=N1;
while(N1=3)
{
while(N1%l!=0)
{
l++;
}
a[j++]=l;
N1=N1/l;
}
printf("请输入一个奇数E,若E不合适,系统将会找一个比E大的合适值:");
scanf("%d",E);
for(i=E;t0;i=i+2)
{
for(k=0;kj+1;k++)
{
if(E%a[k-1]==0) break;
else if(k==j)
{
t--;
}
E=i;
}
}
for(k=1; ;k++)
{
if((N0*k+1)%E==0)
{
D=(N0*k+1)/E;
if((D*E)%N0==1)
break;
}
}
printf("请输入明文:");
scanf("%ld",PT);
for(i=1;i=E;i++)
{
fn=(f1*PT)%N;
f1=fn;
CT=fn;
}
f1=1;
for(i=1;i=D;i++)
{
fn=(f1*CT)%N;
f1=fn;
PT=fn;
}
printf("P=%d,Q=%d\n",P,Q);
for(k=0;kj;k++)
printf("%d ",a[k]);
printf("\n");
printf("E=%d,D=%d,N=%ld\n",E,D,N);
printf("密码是:%ld\n",CT);
printf("明文是:%ld\n",PT);
return 0;
}
rsa算法c语言实现
程序修改如下:
(主要是你的循环写的不对,输入的字符应该-'0'才能与正常的数字对应)
#includestdio.h
#includemath.h
int
candp(int
a,int
b,int
c)
{int
r=1;
int
s;
int
i=1;
for(i=1;i=b;i++)r=r*a;
printf("%d\
",r);
s=r%c;
printf("%d\
",s);
return
s;}
void
main()
{
int
p,q,e,d,m,n,t,c,r
;
char
s;
printf("please
input
the
p,q:");
scanf("%d%d",p,q);
n=p*q;
t=(p-1)*(q-1);
printf("the
n
is
%12d\
",n);
printf("please
input
the
e:");
scanf("%d",e);
while(e1||en)
//此处修改为while循环
{
printf("e
is
error,please
input
again:");
scanf("%d",e);
}
d=1;
while(((e*d)%t)!=1)
d++;
printf("then
caculate
out
that
the
d
is
%d\
",d);
printf("the
cipher
please
input
1\
");
printf("the
plain
please
input
2\
");
scanf("%c",s);
while((s-'0')!=1(s-'0')!=2)
//消除后面的getchar()
此处增加while循环注意括号内的字符
{scanf("%c",s);}
switch(s-'0')
{
case
1:printf("intput
the
m:");
scanf("%d",m);
c=candp(m,e,n);
printf("the
plain
is
%d\
",c);break;
case
2:printf("input
the
c:");
scanf("%d",c);
m=candp(c,d,n);
printf("the
cipher
is
%8d\
",m);
break;
}
}